Php 重写同一属性上的_get和_set的递归限制
是否有方法覆盖同一属性上的Php 重写同一属性上的_get和_set的递归限制,php,php-internals,Php,Php Internals,是否有方法覆盖同一属性上的\uuu get和\uu set的递归限制。我希望能够以不同于第一次进入的方式处理第二次再入 这个代码示例不实用,但最简单的说明了这一点 class Foo { public function __set($name,$value){ print "$name entered\n"; this->$name = $value; // want it to recurse here } } $a = ne
\uuu get
和\uu set
的递归限制。我希望能够以不同于第一次进入的方式处理第二次再入
这个代码示例不实用,但最简单的说明了这一点
class Foo {
public function __set($name,$value){
print "$name entered\n";
this->$name = $value; // want it to recurse here
}
}
$a = new Foo();
$a->baz = "derp";
print $a->baz;
// should get (cannot test at the moment)
// baz entered
// derp <- you get derp because the current php implementation creates an instance variable from the second call to __set
class-Foo{
公共函数集($name,$value){
打印“$name entered\n”;
this->$name=$value;//希望它在这里递归
}
}
$a=新的Foo();
$a->baz=“derp”;
打印$a->baz;
//应获得(目前无法测试)
//巴兹进来了
//derp使用这种语法无法做到这一点。直接调用\u set
,例如:
class Foo {
public function __set($name, $value) {
print "$name entered\n";
$this->__set($name, $value);
}
}
我知道这是一个老问题,但我想这就是你真正想要的
<?php
class Foo {
private $_data = array();
public function __set($name,$value){
print "$name entered\n";
$this->_data[$name] = $value;
}
public function __get($name){
if(array_key_exists($name, $this->_data)){
return $this->_data[$name];
} else {
return false;
}
}
}
$a = new Foo();
$a->baz = "derp";
print $a->baz;
?>
您能提供一个代码示例吗?很抱歉,我不知道您的意思。这样u集就不会递归(顺便说一下,我想你的意思是This->$var=$args;
)。没错,它不会递归,这就是问题所在。Php防止它再次出现,并创建一个实例变量。我想知道是否有办法放松对uuu set()和uu get()的递归限制。因为这个问题与这个问题相关,所以我试图找到一个比生成u set/u get方法更优雅的解决方案。我不明白您试图解决的问题。你谈论递归,但没有递归,你说你试图找到一个比_get()和_set()神奇方法更优雅的解决方案,但你确实使用了它们。请在一个完整的终端前编辑您的问题,正确解释问题所在。不,这不会按照我需要的方式工作。我认为要完成我即将完成的工作,需要修改zend引擎并重新编译php。这也是不可接受的,哦,好吧。@kporter:因为除了“在此处递归”之外,你没有说你需要它做什么,所以如果没有更多的信息,我无法进一步帮助你。好吧,我确实在同一个属性上说了,但是你添加了下划线,从而创建了一个新属性。第二,我希望能够使用$this->$name进行递归(顺便说一句,您可以使用$n=$name.\u'然后使用$this->$n并存档相同的结果,但仍然不是我想要的结果。它必须是$this->$name,并且在当前的u set()php实现中可能无法实现。我添加了下划线以防止无限递归。你的整个问题毫无意义。实际上,没有任何有效的理由这样做。事实上,有,请参阅上面评论中的链接。其想法是,当有人调用$foo->bar=“derp”时,它将依次调用$thsi->set_bar(“derp”)现在父类在uu call()中为此定义了一个默认处理程序,但子类可以定义其一个set_bar()方法并定义不同的行为,但问题是派生类不能使用$this->baz=“derp”。