php __get方法和可见性类型行为

时间:2011-09-16 10:10:09

标签: php

class Magic{
    public $a="i";
    public $b=array("a"=>"A","b"=>"B","c"=>"C");
    public $c=array(1,2,3);

    public function __get($v)
    {
     echo "<br/>get->$v";
     return $this->b[$v];
    }

    public function __set($var,$val)
    {
    echo "<br/>set->$var: $val,";
    $this->$var=$val;
    }
    }

    $m=new Magic();
    echo $m->a." , ".$m->b." ,".$m->c." ,";
    $m->c="CC";
    echo $m->a." , ".$m->b." ,".$m->c;

输出:i,数组,数组,i,数组,CC

现在,我将变量$ b和$ c的可见性修改为受保护。

输出:bci,B,C,c:CC,bci,B,C

据我所知_ get和 _set是为undefined var .So调用的,当access modifier或visibility设置为protected时,为什么调用__get()!。

有人可以解释.....我无法理解这一点。

3 个答案:

答案 0 :(得分:2)

来自manual

  

__ set()在将数据写入不可访问的属性时运行。

     

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

受保护/私有财产被视为无法从外部范围访问。

答案 1 :(得分:1)

每次尝试从“外部”访问非公共变量时,都会调用

__get()。因此,它涵盖了不存在的,受保护的和隐藏的属性。

答案 2 :(得分:0)

除了上述评论。

将b和c设置为受保护时。这意味着,当这样调用时,属性a是可见的:

echo $ m-&gt; a; //直接进入公共财产。

然而,当回显$ m-&gt; b和$ m-&gt; c时,它无法找到它,因为可见性仅在类中可用。幸运的是,__ set()和__get()在你的类中实现。

因此,在尝试回显(读取)属性时调用__get(),并在尝试分配属性时调用__set()。

需要注意的一个重要棘手的事情是...... __get()中的第一行将覆盖回声的第一部分($ m-&gt; a)......

了解更多信息:http://www.php.net/manual/en/language.oop5.visibility.php

class Magic {

public $a="i";
protected $b=array("a"=>"A","b"=>"B","c"=>"C");
protected $c=array(1,2,3);

public function __get($v)
{
 echo "<br/>get->$v";
 return $this->b[$v];
}

public function __set($var,$val)
{
echo "<br/>set->$var: $val,";
$this->$var=$val;
}
}

$m=new Magic();
echo $m->a." , ".$m->b." ,".$m->c." ,";  // __get() called here only for b & c

$m->c="CC";  // __set() is called here for c

echo $m->a." , ".$m->b." ,".$m->c; // __get() is called here for b & c