поведение функции get() в php


Я пытался найти последовательность, в которой магические методы вызываются в PHP. Поэтому написал очень простую программу

class testme
{
    public $var1;
    /*function __construct()
    {
        echo'<br/> Constructor called';
    }*/
      public function __set($name, $value)
    {
        echo'<br/> You are in sssset function';
    }
    public function __call($method,$arg)
    {
        echo '<br/> call method';
    }
    public function __get($name)
    {
        echo'<br/> You are in get function';
    }
    public function __isset($name)
    {
        echo'<br/> You are in isset function';
    }
    public function __unset($name)
    {
        echo'<br/> You are in unset function';
    }   
       function __destruct() {
       print "<br/>Destroying " . $this->name . "\n";
   }
}
$obj = new testme;
$obj->var1=5;

Ожидаемый результат был

You are in set function
Destroying 

Получение:

You are in get function
Destroying 

$obj->var1=5 Здесь я устанавливаю значение для класса var, тогда почему он вызывает __get. Что здесь не так?

Author: Tim Cooper, 2011-04-25

4 answers

Если вы сделаете var_dump на $name внутри __get, вы увидите, что он содержит name. Функция __get на самом деле вызывается в __destruct. Это связано с тем, что $var1 является доступным членом, поэтому не вызывает функции __get или __set.

Из Документации PHP:

Вызываются методы перегрузки при взаимодействии со свойствами или методами, которые не были объявлены или не видны в текущей области. Остальные в этом разделе будут использоваться термины "недоступные свойства" и "недоступные методы" для обозначения этой комбинации объявления и видимости.

Поскольку $var1 определен и общедоступен, магические методы не вызываются.

 8
Author: Tim Cooper, 2011-04-25 13:06:30

У вас есть свойство $var1 в вашем классе, поэтому __set не вызывается : оно вызывается только тогда, когда нет свойства с именем того, которое вы пытаетесь установить.

Удалите это общедоступное свойство $var1, и будет вызвано __set.


Тем не менее, даже после удаления этого свойства, __get все еще вызывается.

Если вы поместите echo в конце своего сценария, вы увидите, что __get вызывается после того, как echo - т.Е. После того, что кажется концом вашего сценарий.


И если вы взглянете на свой метод деструктора:

function __destruct() {
    print "<br/>Destroying " . $this->name . "\n";
}

Вы видите, что этот деструктор пытается прочитать из несуществующего свойства - отсюда и вызов __get.

 5
Author: Pascal MARTIN, 2011-04-25 13:05:48

__get/__set вызываются только в том случае, если общедоступная переменная недоступна. Попробуйте $obj->var2=5, и вы получите ожидаемый результат.

__get вызывается, потому что ваша команда уничтожения включает неизвестный параметр $this->name

 0
Author: Rudu, 2011-04-25 13:06:32

get вызывается деструктором ($this->name). В классе нет члена name, поэтому вызывается magical get. Магический set вызывается только в том случае, если вы пытаетесь установить элемент, который не существует. var1 существует, поэтому __set() вызывать не нужно.

Вы заявляете

Я пытался найти последовательность, в которой называются магические методы

Все магические методы вызываются взаимоисключающими конструкциями, поэтому никогда не существует способа вызвать более одного с помощью та же операция. Они не вызываются последовательно.

 0
Author: Explosion Pills, 2011-04-25 13:13:06