Тестирование isset ($ this) не работало для меня, как упомянул troelskn "$ this будет установлено как контекст вызывающих абонентов."
abstract class parent
{
function bar()
{
if( isset( $this ) ) do_something();
else static::static_bar();
}
function static static_bar()
{
do_something_in_static_context();
}
}
class child extends parent
{
...
}
$foo = new child();
$foo->bar(); //results in do_something()
child::bar(); //also results in do_something()
В моем случае у меня есть родительский класс с объектной и статической контекстной функцией, которая выполняет ту же задачу в дочернем классе. isset ($ this) всегда возвращал true, однако я заметил, что хотя $ this переключается между классом child в объектном контексте и вызовом (?) класса в статическом контексте, чудесная __class__
магическая константа осталась родительской для класса!
Вскоре после нахождения функции is_a мы можем проверить, находимся ли мы в статическом контексте:
if( is_a($this, __CLASS__) ) ...
Возвращает true в контексте объекта, false в статическом контексте.
Пожалуйста, проверьте свои собственные реализации, так как я проверяю это только для моего конкретного сценария (уникальный случай вызова наследования) в 5.3.
К сожалению (для моего случая) я пока не могу найти способ вызвать static_bar()
, поскольку $ this и static относятся к отдельному классу, а __class__
относится к родительскому классу. Мне нужен способ вызова child :: static_bar () ...