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”。