代码之家  ›  专栏  ›  技术社区  ›  Matt

解决php无休止的递归问题

  •  0
  • Matt  · 技术社区  · 16 年前

    我正在实现一个调用各种对象方法的消息服务。。这很像观察者模式。。

    事情是这样的:

    class Dispatcher {
    ...
        public function message($name, $method) {
    
        // Find the object based on the name
        $object = $this->findObjectByName($name);
    
        if(!$object->decorations))
                // Decorate the object
            $object = new $name($object); // This is where it locks up.
                $object->decorations = true;
        }
    
        return $object->$method();
    ...
    }
    
    class A {
        function __construct()
        {
            $Dispatcher->message("B", "getName");
        }
    
        public function getName() {
            return "Class A";
        }
    
    }
    
    class B {
        function __construct()
        {
                // Assume $Dispatcher is the classes
            $Dispatcher->message("A", "getName");
        }
    
        public function getName() {
            return "Class B";
        }
    
    }
    

    它在两个对象都未初始化时锁定。它只是在消息之间来回传递,不能初始化任何人。

    我在寻找某种队列实现,它可以让消息互相等待。。返回值仍然被设置的地方。我希望在A级和B级中有尽可能少的样板代码。


    我得到很多关于 not_initialized 方法,不幸的是,我觉得讨论的方向不对。那是我的错,我会把情况解释得再详细一点(我希望能解释得更好)。

    $object 实现一个装饰器模式-即 $对象 当我初始化类A和类B时获取更多的功能(方法)。我需要使用消息传递方法中的装饰提供的功能,这就是为什么如果消息传递方法尚未修饰,请对其进行装饰。我真的不认为 未初始化 如果你说 $objectA

    1 回复  |  直到 12 年前
        1
  •  4
  •   Thorarin    16 年前

    这不是死锁的例子,而是无休止的递归。很可能是你的 not_initialized 函数返回true,直到构造函数完全运行。 因此,构造a类型的对象将间接调用B构造函数,而B构造函数将无限调用a构造函数。

    未初始化

    Deadlock