如何_get属性PHP?

时间:2017-09-07 20:51:00

标签: php oop

我使用魔术方法_set,_get:

public function __set($name, $value)
    {
        array_push($this->groups, $value);
    }

    public function __get($name)
    {
        return $this->$name;
    }

使用它像:

// Set
$menu->groupName = 'Регистрация';

// Get
echo $menu->groupName

为什么echo $menu->groupName不起作用?什么也没有回报。它应该返回文本'Регистрация'

我尝试回到_get

return $name;

2 个答案:

答案 0 :(得分:2)

__set中,您处理分配给不存在的属性,因为将其值添加到数组$this->groups。此代码不会为您创建属性。

如果要访问不存在的属性__get,则可以使用。但是在其中你想要访问groupName属性,但你没有创建它。

要调试代码,请添加一行

echo'<pre>',print_r($this),'</pre>';

给你__get方法:

public function __get($name)
{
    echo'<pre>',print_r($this),'</pre>';    // TODO

    return $this->groups[0];
}

你会看到“Регистрация”在那里,但它在$groups属性中。

因此,您可以将__get修改为

public function __get($name)
{
    return $this->groups[0];
}

因为$groups中没有其他值。

或修改完整代码:

public function __set($name, $value)
{
    $this->groups[$name] = $value;
}

public function __get($name)
{
    return isset($this->groups[$name]) ? $this->groups[$name] : 'NO VALUE';
}

答案 1 :(得分:0)

来自PHP Documentation重载:

  

在与尚未声明或在当前作用域中不可见的属性或方法交互时,将调用重载方法。本节的其余部分将使用术语“不可访问的属性”和“不可访问的方法”来引用声明和可见性的这种组合。

简而言之,您希望由重载方法处理的属性必须是私有的,受保护的或未定义的。

此外,PHP中不常使用重载本身。在大多数情况下,最好创建自己的get()set()方法,而不是继承与重载魔术方法相关的复杂性。即使这样,自定义get / set方法只有在不仅仅存储数据时才是实用的。

重载过程具有意义:

重载非常适合安全性,验证和数据转换,因为它允许您控制应用程序中信息的可见性。

通过重载,您可以创建以下变量:

  • 只能阅读
  • 只能写入
  • 只能读或写一定次数
  • 可在编写前验证
  • 可以更新其他变量