Понимание простого класса с помощью магических методов

Я только начал следить за видео-серией о ООП в PHP и сделал следующий класс после одной лекции. Сначала не было __get и __set , потому что он показал нам, как бороться с публичными переменными. Но для демонстраций лектор изменил public $postal_code на protected $_postal_code. В основном, он показал, что он может изменить исходный почтовый код, который мы установили, используя

 $adress->postal_code = "M422 3555"; 

в « ADDED PROTECTED VALUE » с помощью этого метода

  protected function _postal_code_guess(){ return 'ADDED PROTECTED VALUE'; 

Теперь две основные вещи, с __set мне трудно понять, – как наши методы __get и __set знают, что такое $name ? Если я echo $name перед чем-либо в методах get или set, он сообщает мне, что он представляет postal_code . Но почему? Где он получает эту ценность?

Другая вещь, о которой я немного смущаюсь, – это то, как строка $output.=",".$this->postal_code; все еще работает. Потому что мы изменили наш оригинальный публичный $postal_code на защищенный $_postal_code; Доу-послание означает, что мы должны изменить

 $output.=",".$this->postal_code; 

в

 $output.=",".$this->_postal_code; 

TLDR

1. Как наш код знает, что такое $name ?

  1. Почему нам все еще разрешено делать $output.=",".$this->postal_code; , даже когда наша переменная была изменена на protected _postal_code

Ниже приведен весь код

 class Adress{ public $country; public $province; public $city; public $adress; protected $_postal_code; // primary key of an adress protected $_adress_id; protected $_time_created; protected $_time_updated; function __get($name){ if(!$this->_postal_code){ $this->_postal_code = $this->_postal_code_guess(); } // attempt to return a protected property by name $protected_property_name = "_".$name; if(property_exists($this,$protected_property_name)){ return $this->$protected_property_name; } trigger_error("Undefined property via __get".$name); return null; } function __set($name,$value){ if('postal_code' == $name){ $this->$name = $value; return; } trigger_error('Undefined or unallowed propert via __set()'); } protected function _postal_code_guess(){ return 'ADDED PROTECTED VALUE'; } function display(){ $output = ''; $output.=$this->country; $output.="<br/>"; $output.=$this->province; $output.=' '.$this->city; $output.=" ".$this->adress; $output.=",".$this->postal_code; return $output; } 

}

Вот файл demo.php, где мы запускаем его

 <?php require 'index.php'; $adress = new Adress; $adress->country = "Canada"; $adress->province = "Ontario"; $adress->city = "Toronto"; $adress->adress ="4324323 Bob Street"; $adress->postal_code = "M422 3555"; echo '<tt><pre>'.var_export($adress,TRUE).'</tt></pre>'; echo $adress->display(); echo '<h2>Test Protected Variables</h2>'; unset($adress->postal_code); echo $adress->display(); с <?php require 'index.php'; $adress = new Adress; $adress->country = "Canada"; $adress->province = "Ontario"; $adress->city = "Toronto"; $adress->adress ="4324323 Bob Street"; $adress->postal_code = "M422 3555"; echo '<tt><pre>'.var_export($adress,TRUE).'</tt></pre>'; echo $adress->display(); echo '<h2>Test Protected Variables</h2>'; unset($adress->postal_code); echo $adress->display();