【问题标题】:Override recursion limits for __get and __set on the same property覆盖同一属性上 __get 和 __set 的递归限制
【发布时间】:2012-08-15 12:42:09
【问题描述】:

有没有办法覆盖同一属性上 __get__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

我的网络中断了,所以我在手机上打字,所以很可能有错别字。

【问题讨论】:

  • 您能提供一个代码示例吗?
  • 对不起,我不知道你的意思。这样 __set 就不会递归(顺便说一句,我认为您的意思是 this-&gt;$var = $args; )。
  • 你的权利,它不是递归的,这就是问题所在。 Php 阻止它重新使用并创建一个实例变量。我想知道是否有办法放宽对 __set() 和 __get() 的递归限制。
  • 请参阅stackoverflow.com/questions/11980996/…,因为这个问题与那个问题有关,因为我试图找到一个比制作 _set/_get 方法更优雅的解决方案。
  • 我不明白您要解决的问题。您谈论递归,但没有递归,您说您尝试找到比 __get() 和 __set() 魔术方法更优雅的解决方案,但是您确实使用了它们。请在完整的终端前编辑您的问题,正确解释问题所在。

标签: php php-internals


【解决方案1】:

使用该语法无法做到这一点。直接拨打__set即可,例如:

class Foo {
     public function __set($name, $value) {
         print "$name entered\n";

         $this->__set($name, $value);
     }
}

【讨论】:

  • 不,这不会按我需要的方式工作。我认为要做我附近的事情需要我修改zend引擎并重新编译php。这也是不可接受的,哦,好吧。
  • @kporter:由于您没有说除了“在此处递归”之外您需要它做什么,因此如果没有其他信息,我无法进一步帮助您。
  • 好吧,我确实在同一个属性上说过,但是您添加了一个下划线,从而创建了一个新属性。两个我希望能够使用 $this->$name 进行递归(顺便说一句,您可以先完成 $n = $name . '_' 然后 $this->$n 并存档相同的结果,但仍然不是我想要的. 它必须是 $this->$name 并且在 __set() 的当前 php 实现中可能是不可能的。
  • 我添加了下划线以防止无限递归。你的整个问题真的没有任何意义,没有任何正当理由要做这样的事情。
  • 其实有的,见上面cmets中的链接。这个想法是当有人调用 $foo->bar = "derp";它将依次调用 $thsi->set_bar("derp") 现在父类在 __call() 中为此定义了一个默认处理程序,但子类可以定义其一个 set_bar() 方法并定义不同的行为,但问题是派生类不能使用 $this->baz = "derp"。
【解决方案2】:

我知道这是一个老问题,但我认为这正是您真正想要的。

<?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;
?>

http://phpfiddle.org/main/code/4h0-an7

【讨论】:

    猜你喜欢
    • 2016-06-09
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 2010-12-09
    • 2012-04-05
    • 1970-01-01
    相关资源
    最近更新 更多