除非我完全错了,否则__get
和__set
方法应该允许重载get
和set
的→。
例如,以下语句应调用__get
方法:
echo $foo->bar;
$var = $foo->bar;
下面的代码应该使用__set
方法:
$foo->bar = 'test';
这在我的代码中是不起作用的,并且可以通过这个简单的例子重现:
class foo {
public $bar;
public function __get($name) {
echo "Get:$name";
return $this->$name;
}
public function __set($name, $value) {
echo "Set:$name to $value";
$this->$name = $value;
}
}
$foo = new foo();
echo $foo->bar;
$foo->bar = 'test';
echo "[$foo->bar]";
这只会导致:
[test]
在其中放置一些die()
调用表明它根本没有命中它。
现在,我只是说去它的吧,我现在在需要的地方手动使用__get
,但这不是非常动态的,需要知道除非特别调用,否则“重载”代码实际上是不会被调用的。我想知道这是不是不应该以我所理解的方式工作,或者为什么它不工作。
这是在php 5.3.3
上运行的。
发布于 2011-01-17 21:37:05
我建议使用一个数组来通过__set()
存储所有值。
class foo {
protected $values = array();
public function __get( $key )
{
return $this->values[ $key ];
}
public function __set( $key, $value )
{
$this->values[ $key ] = $value;
}
}
这样,您就可以确保不能以其他方式访问变量(请注意,$values
是受保护的),以避免冲突。
发布于 2011-01-17 21:36:15
这是因为$bar是公共财产。
$foo->bar = 'test';
在运行上面的代码时,不需要调用魔术方法。
从类中删除public $bar;
应该会纠正这个问题。
发布于 2011-01-17 21:36:43
删除public $bar;
声明,它应该会像预期的那样工作。
https://stackoverflow.com/questions/4713680
复制相似问题