Странный результат использования методов экземпляра в 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

Author: hakre, 2012-01-13

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 ..."

Конечно, в данном случае простая передача объекта в качестве аргумента была бы намного понятнее и предпочтительнее.

 4
Author: Wrikken, 2012-01-12 20:22:21