我试图掌握PHP的魔术方法,为此我创建了一个如下所示的测试类:
switchConstruct(func_get_args()); } protected function switchConstruct(array $args) { switch (count($args)) { case 0: return print "0 params
"; case 1: return call_user_func_array(array($this, 'constr1'), $args); case 2: return call_user_func_array(array($this, 'constr2'), $args); } die("Invalid number of args"); } protected function constr1($a) { print "constr1 called
"; } protected function constr2($a, $b) { print "constr2 called
"; } public function __get($name) { $this->lastCalledParam = $name; return $this->{$name}; } public function __set($name, $value) { $this->lastCalledParam = $name; $this->{$name} = $value; } protected function lastCalled() { if (func_num_args() == 1) { $args = func_get_args(); $this->lastCalledParam = $args[0]; } return $this->lastCalledParam; } public function __toString() { return $this->lastCalledParam == null ? "No data found" : $this->lastCalledParam; } }
并称之为:
__toString(); print "
"; $c->param = "Hello"; print $c->__toString(); ?>
我期待的行为是,在第一次__toString()
通话时,会有:
0参数
没有找到数据
你好
但我得到的是:
0参数未
找到
数据未找到数据
我已经找到了一个主要的关键点,并且无法理解为什么它没有做设置lastCalledParam
属性的工作!
我得到了总共0个错误和0个警告,并且启用了完整的错误和警告报告,所以我不明白什么是未被调用,在哪里/为什么.
__set
仅在无法正常访问参数时才会调用.你public $param
需要protected
至少__set
被调用.
__set()
在将数据写入不可访问的属性时运行.http://php.net/manual/en/language.oop5.overloading.php#object.set(强调我的)