поведение функции 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
. Что здесь не так?
4 answers
Если вы сделаете var_dump
на $name
внутри __get
, вы увидите, что он содержит name
. Функция __get
на самом деле вызывается в __destruct
. Это связано с тем, что $var1
является доступным членом, поэтому не вызывает функции __get
или __set
.
Вызываются методы перегрузки при взаимодействии со свойствами или методами, которые не были объявлены или не видны в текущей области. Остальные в этом разделе будут использоваться термины "недоступные свойства" и "недоступные методы" для обозначения этой комбинации объявления и видимости.
Поскольку $var1
определен и общедоступен, магические методы не вызываются.
У вас есть свойство $var1
в вашем классе, поэтому __set
не вызывается : оно вызывается только тогда, когда нет свойства с именем того, которое вы пытаетесь установить.
Удалите это общедоступное свойство $var1
, и будет вызвано __set
.
Тем не менее, даже после удаления этого свойства, __get
все еще вызывается.
Если вы поместите echo в конце своего сценария, вы увидите, что __get вызывается после того, как echo - т.Е. После того, что кажется концом вашего сценарий.
И если вы взглянете на свой метод деструктора:
function __destruct() {
print "<br/>Destroying " . $this->name . "\n";
}
Вы видите, что этот деструктор пытается прочитать из несуществующего свойства - отсюда и вызов __get
.
__get
/__set
вызываются только в том случае, если общедоступная переменная недоступна. Попробуйте $obj->var2=5
, и вы получите ожидаемый результат.
__get
вызывается, потому что ваша команда уничтожения включает неизвестный параметр $this->name
get
вызывается деструктором ($this->name
). В классе нет члена name
, поэтому вызывается magical get. Магический set
вызывается только в том случае, если вы пытаетесь установить элемент, который не существует. var1
существует, поэтому __set()
вызывать не нужно.
Вы заявляете
Я пытался найти последовательность, в которой называются магические методы
Все магические методы вызываются взаимоисключающими конструкциями, поэтому никогда не существует способа вызвать более одного с помощью та же операция. Они не вызываются последовательно.