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()!。
有人可以解释.....我无法理解这一点。
答案 0 :(得分:2)
答案 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