Я только начал следить за видео-серией о ООП в 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
?
$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();