这个问题与:PHP魔术方法示例有关
我在接受的答案中的评论中问了这个问题,但我想,它没有被注意到,所以我必须创建这个问题。
<?php
class Magic {
public $a = "A";
protected $b = array(
"a"=>"A",
"b"=>"B",
"c"=>"C"
);
protected $c = array(1,2,3);
public function __get($v) {
echo "$v,";
return $this->b[$v];
}
public function __set($var, $val) {
echo "$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;
?>
输出:
b,c,A,B,C,c: CC,b,c,A,B,C
$m->c = "CC";
在这里,我们已经有了同名的受保护变量。那么,这在可见性的上下文中应该如何表现呢?
如果它覆盖受保护变量的值c
,那么它不是受保护/私有变量的漏洞吗?(我想不会是这样)
如果不是,那么语句:$this->$var = $val;
似乎创建了已定义为受保护的同名公共变量。那可能吗?
另外,在这个语句之后:$m->c = "CC";
,当我们$m->c
再次访问时,PHP__get
再次调用,就好像c
没有公共可见性一样。这是否意味着$this->$var = $val;
没有生命周期来立即下一个声明?(我想也不会是这样)
谁能解释一下,它应该在这种情况下表现以及它是如何给出这样的输出的?