У меня есть базовый класс со статической функцией. Но я хотел бы иметь способ узнать фактический класс (может быть базовый класс или производный класс), в контексте которого я вызываю статическую функцию.
Например:
<?php
class Foo
{
static function Test()
{
$c = self::class;
echo "Hello, I am creating a new instance of type $c";
return new $c;
}
}
class Bar extends Foo
{
public $someProperty;
}
$b = Bar::Test(); // This should do something different than Foo::Test();
?>
Обратите внимание, что self::class
в функции Test()
всегда приводит к 'Foo'
, даже если я вызываю ее, используя контекст Bar::
.
Я понимаю, что могу переопределить функцию Test()
в Bar
, но это не то, чего я хочу, я хочу сохранить реализованную функциональность в базовой функции Test()
. Но только с фактическим контекстом статического класса, с которым я его вызываю.
Есть ли способ для приведенной выше функции Test()
сказать: «Я создаю новый экземпляр типа Bar» и вернуть экземпляр Bar
, а не Foo
?
Foo::Test()
вместоself::class
мне пришлось использоватьget_called_class()
(manual) и теперь все работает именно так, как задумано! ВызовFoo::Test()
создастFoo
, вызовBar::Test()
создастBar
! ???? 05.12.2019