我在阅读W.Jason Gilmore的《开始PHP和MYSQL》一书时,发现了一个对我来说没有意义的部分。
class Employee
{
var $name;
var $city;
protected $wage;
function __get($propName)
{
echo "__get called!<br />";
$vars = array("name","city");
if (in_array($propName, $vars))
{
return $this->$propName;
}else {
return "No such variable!";
}
}
}
$employee = new Employee();
$employee->name = "Mario";
echo $employee->name."<br />";
echo $employee->age;
这将返回以下内容:
马里奥__接到电话!没有这样的变量!
我遇到的第一个问题是,当name属性设置为"Mario"时,访问器方法不运行,我做了一点搜索,似乎__get只在从不可访问的属性读取数据时运行,尽管书中从未对此进行过说明。这就是__get方法当时没有运行的原因吗?
我提出的第二个问题是关于"如果"的说法。如果__get确实只在尝试从不可访问的属性中读取时运行,那么为什么在它内部有一个"If",用于检查该属性是否已经在设置的变量数组中?肯定不会,或者你不会说"如果",对吗?
只有在无法从调用范围访问属性(不存在或受保护或私有)的情况下,才会调用magic __get和__set方法。在这种情况下,由于您的属性存在并且是公共的,因此它不会执行setter调用。
要使示例工作,您必须执行以下操作:
class Employee
{
protected $name;
protected $city;
protected $wage;
function __set ($property, $value){
$this->$property = $value;
}
function __get($propName)
{
echo "__get called!<br />";
$vars = array("name","city");
if (in_array($propName, $vars))
{
return $this->$propName;
}else {
return "No such variable!";
}
}
}
$employee = new Employee();
$employee->name = "Mario";
echo $employee->name."<br />";
echo $employee->age;
首先,作用域为protected的属性有效地将它们隐藏在调用作用域之外。然后为了允许分配($employee->name = "Mario";
),添加了魔术设置器__set
。