【发布时间】:2014-01-21 18:04:32
【问题描述】:
此问题与:PHP magic methods example
我在接受的答案中的评论中提出了这个问题,但我想,它没有被注意到,所以我必须创建这个问题。
<?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; 没有生命周期来立即下一个声明? (我想也不会是这样)
谁能解释一下,它在这种情况下应该如何表现,以及它是如何给出这样的输出的?
【问题讨论】:
-
相关文章:All properties should be private!!;通读谷歌翻译。
-
通常,魔术方法的全部意义在于暴露受保护的变量,并可能在途中使用一些逻辑。对于任何普通的公共变量,您都不需要它们。所以,是的,它正在按预期工作!如果您不想公开它们,请不要使用魔术方法或在这些方法中实现自己的过滤器。
标签: php visibility magic-methods zend-certification