在php中使用__get()时没有显示预期的结果

时间:2013-07-22 02:52:40

标签: php

<?php
class classname
{
public $attribute;
function __get($name)
{
return 'here:'.$this->$name;
}
function __set ($name, $value)
{
$this->$name = $value;
}
}
$a = new classname();
$a->attribute = 5;
echo $a->attribute;

当我在脚本上面运行时,显示:5

问题:

echo $a->attribute;这行代码会调用function __get($name),对吗?那么为什么它没有显示:here:5

3 个答案:

答案 0 :(得分:2)

您已将该属性标记为公开,因此可以从该类外部访问该属性。

  

__ get()用于从无法访问的属性中读取数据。

http://www.php.net/manual/en/language.oop5.overloading.php#object.get

如果要强制任意属性调用__get和__set,可以将它们存储在私有映射中:

class classname
{
    private $vars = array();
    function __get($name)
    {
        return 'here:'.$this->vars[$name];
    }
    function __set ($name, $value)
    {
        $this->vars[$name] = $value;
    }
}

答案 1 :(得分:1)

只有在调用范围内未定义或无法访问属性属性或方法或未定义时,才会调用magic __get和__set以及__call。

要完成此项工作,您必须删除对属性的公开引用,或将其设为受保护或私有。

class classname
{
  protected $attribute;
  function __get($name)
  {
    return 'here:'.$this->$name;
  }
  function __set ($name, $value)
  {
    $this->$name = $value;
  }
}
$a = new classname();
$a->attribute = 5; //  calling __set
echo $a->attribute; // calling __get

答案 2 :(得分:0)

这里'属性'是公共的,所以不会调用__get()魔术方法。