__从书中获取和设置方法&;开始PHP和MySQL”;


__get and __set methods from the book "Beginning PHP and MySQL"

我在阅读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