1

我正在阅读 W. Jason Gilmore 所著的“Beginning PHP and MYSQL”一书,遇到了对我来说没有意义的部分。这是关于 OOP 中的访问器和修改器的部分。

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 方法的原因吗?

我遇到的第二个问题与“if”语句有关。如果 __get 仅在尝试从不可访问的属性中读取时才真正运行,为什么您会在其中包含一个“if”来检查该属性是否已经在您设置的变量数组中?当然不会,或者你不会得到“如果”,对吗?

4

1 回答 1

1

魔术 __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;

首先,范围为受保护的属性有效地将它们隐藏在调用范围之外。然后为了允许赋值 ( $employee->name = "Mario";),添加了魔法设置器__set

于 2013-07-18T15:09:44.987 回答