Решить PHP бесконечный вопрос рекурсии - PullRequest
0 голосов
/ 22 мая 2010

Я сейчас нахожусь в бесконечной ситуации рекурсии.

Я реализую службу сообщений, которая вызывает различные методы объекта .. она очень похожа на шаблон наблюдателя ..

Вот что происходит:

Dispatcher.php

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";
    }

}

Блокируется, когда ни один объект не инициализирован. Он просто переходит от сообщения друг к другу, и никто не может быть инициализирован.

Я ищу какую-то реализацию очереди, которая заставит сообщения ждать друг друга .. Та, где возвращаемые значения все еще установлены. Я хочу, чтобы в классе А и В было как можно меньше стандартного кода.


Мне много говорят о методе not_initialized, к сожалению, я чувствую, что обсуждение идет в неправильном направлении. Это моя вина, я объясню ситуацию немного больше (и, надеюсь, лучше).

$object реализует шаблон декоратора - то есть $object получает больше возможностей (методов), когда я инициализирую класс A и класс B. Мне нужно использовать эти функции, доступные из украшений в методе обмена сообщениями, поэтому его еще не украсили, украсьте его. Я действительно не думаю, что not_initialized было бы проблемой, потому что, когда говорят, что $objectA проверено, это еще не украшено - поэтому я хочу добавить эти методы к нему. Класс A и B являются классами декораторов. Так что not_initialized является правильным в то время. Он застревает, когда я пытаюсь украсить предмет. Я изменил код, чтобы лучше отразить эту ситуацию.

1 Ответ

4 голосов
/ 22 мая 2010

Это не пример тупика, а бесконечной рекурсии. Скорее всего, ваша not_initialized функция возвращает true, пока конструктор не будет полностью запущен. В результате, создание объекта типа A будет косвенно вызывать конструктор B, который будет вызывать конструктор A, до бесконечности.

Вам придется изменить функцию not_initialized или переместить отправляемое сообщение из конструкторов, если сможете.

Deadlock - это ситуация, в которой участвуют несколько процессов. В этом случае существует только один процесс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...