Двойное поведение магических методов __set() и __get() с функцией property_exists() и без нее

#php #oop #getter-setter #magic-methods

#php #ооп #получатель-установщик #magic-методы

Вопрос:

Я пытаюсь понять магические функции в классе, и пока я тестировал методы __set() и __get() . код:

 class kids{
 
 private $height;
 public function __set($property$value){
//if(property_exists($this, $property))
      $this->property= $value; //this works
}

 public function __get($property){
 return "The child's height is " . $this->$property . " inches tall";
  }

}
$kid1new kids;

$kid1->height= 45;

echo $kid1->height;
  

ВЫВОД :

 The child's height is 45 inches tall
  

МОЯ ПРОБЛЕМА:

вывод правильный, но если я раскомментирую if(property_exists($this, $property)) , то __set вызывается дважды, и это не изменяет значение height, если я не напишу его так $this->$property= $value; , добавив $ to $this->property .

ВЫВОД с помощью property_exists() :

  The child's height is inches tall
  

Я попытался поискать проблему в Google, но обнаружил, что функция property_exists() не может обнаружить свойства, которые волшебным образом доступны с помощью метода __get magic . Я не понимаю эту заметку.
Если кто-то может пролить свет на это, я был бы очень признателен.

Комментарии:

1. С $this->property= $value; помощью я получаю вывод The child's height is inches tall , $this->property который ссылается на свойство с именем property . $this->$property= $value; работает в приведенном выше коде.

2. Вывод вашего исходного фрагмента (с property_exists проверкой) также не показывает «45». по причине, на которую указал Найджел (и вы сами). Так что, я думаю, вы кое-что перепутали.