我刚刚开始关注PHP上的OOP视频系列,并在一节课后进行了以下课程。起初没有__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';
现在我理解的两个主要问题是我们的__get
和__set
方法如何知道$name
是什么?如果我在get或set方法中的任何内容之前echo $name
,它会告诉我它代表postal_code
。但那是为什么呢?它在哪里设定了这个价值?
我有点困惑的另一件事是$output.=",".$this->postal_code;
行仍在运作。因为我们将原始的公开$postal_code
更改为受保护的$_postal_code;
Doe-sent,这意味着我们应该更改
$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();
答案 0 :(得分:0)
官方PHP手册中有decent description of __get() and __set() magic methods。
$this->postal_code
仅适用于__get()
方法,在您的示例中,该方法动态尝试查找已删除下划线的属性。它不是任何默认的PHP行为,只是特定于您的代码。