【问题标题】:__get and __set methods from the book "Beginning PHP and MySQL"《Beginning PHP and MySQL》一书中的 __get 和 __set 方法
【发布时间】:2013-07-17 14:52:36
【问题描述】:

我正在阅读 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”来检查该属性是否已经在您设置的变量数组中?肯定不会,或者你不会得到“如果”,对吗?

【问题讨论】:

  • 这不是答案,而是所有“
    ”的答案?在此代码中您不需要其中任何一个。
  • @H2ONOCK 我想这只是为了调试目的而格式化输出。
  • @Phas1c an echo("
    ");会在班级的顶部解决这个问题吗?容易得多。
  • 我认为你的书有点过时了,它的var 属性参考;最好找一个更新的教程
  • 假设您有许多受保护的属性,并且您正在获取一个在运行时填充更多未知属性的数据库记录。为了保护应该隐藏的那些,您可以使用 __get 来实现该逻辑并只允许访问某些属性。这是我头脑中的一个例子,用于回答“如果在 __get 中我为什么会有”。

标签: php class oop methods properties


【解决方案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-&gt;name = "Mario";),添加了魔法设置器 __set。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-10
    • 2010-12-09
    • 1970-01-01
    • 2011-06-02
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多