Странный результат использования методов экземпляра в PHP 5.3
Интересно, как на самом деле работает приведенный ниже пример и как можно было бы сделать что-то вроде динамического. Использование call_user_func
или call_user_func_array
не позволяет этому произойти.
<?php
class Person
{
public $name = "George";
public function say_hi()
{
return ExtraMethods::hi();
}
}
class ExtraMethods
{
public function hi()
{
return "Hi, ".$this->name;
}
}
$george = new Person();
echo $george->say_hi();
?>
Это должно привести к:
Hi, George
Интересно, почему метод экземпляра hi
может вызываться не только статически (не удивлен, что это может произойти в PHP), но и почему я могу использовать $this
1 answers
Псевдопеременная $это доступно, когда метод вызывается из контекста объекта. $это ссылка на вызывающий объект (обычно объект, к которому принадлежит метод, но, возможно, другой объект, если метод вызывается статически из контекста вторичного объекта).
Итак, согласно второй части, по замыслу. Имейте в виду, что он использует существующий экземпляр фактического объекта (в других слова, если вы добавите public $name = "SomethingElse";
к ExtraMethods
, результат все равно будет Hi, George
).
Статический вызов метода не является правильным кодированием, но PHP прощает вас и выдает только строгую ошибку:
"Strict Standards: Non-static method ExtraMethods::hi() should not be called statically, assuming $this from incompatible context in ..."
Конечно, в данном случае простая передача объекта в качестве аргумента была бы намного понятнее и предпочтительнее.