ФорумПрограммированиеPHP для идиотов → рекурсия зараза

рекурсия зараза

  • wats

    Сообщения: 134 Репутация: N Группа: Кто попало

    Spritz 30 ноября 2010 г. 10:35

    Привет! В проекте понадобилось сделать одну фишку, но в результате работы получаю ошибку:
    Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 261904 bytes)
    Пример классов в кратце:
    class A {

    public static function get($m)
    {
    $a = new A($m);
    return $a->run();
    }

    public function __construct($m)
    {
    $this->m = $m;
    }

    public function run()
    {
    $b = new B;
    $b->display();
    }
    }

    class B {

    public function __construct()
    {
    $this->m = A::get('message');
    }

    public function display()
    {
    echo $this->m;
    }
    }

    Класс A представляет из себя что то типа фабрики. Проблема в том что не получается использовать A::get('message'); в конструкторе класса B так как в итоге видимо получается бесконечное создание обьектов и ошибка что память переполнена. Может быть можно это как то исправить не изменяя класс B?
  • soul

    Сообщения: 790 Репутация: N Группа: Кто попало

    Spritz 30 ноября 2010 г. 11:19, спустя 43 минуты 21 секунду

    что-то в жухе


    class A {

    static protected $_instance = null;

    public static function get($m)
    {
    if (is_null($instance)) {
    self::$_instance = new A($m);
    }
    return self::$_instance->run();
    }

    public function __construct($m)
    {
    $this->m = $m;
    }

    public function run()
    {
    $b = new B;
    $b->display();
    }
    }


    return self::$_instance->run(); только тут ошибка будет понятно какая
  • wats

    Сообщения: 134 Репутация: N Группа: Кто попало

    Spritz 30 ноября 2010 г. 11:50, спустя 31 минуту 22 секунды

    soulgarden, спасибо, но это не поможет, посмотри функцию run() в ней создается обьект класса B, а значит срабатывает его конструктор, а в конструкторе A::get('message');. То есть в твоем примере объект класса A останется тот же самый, но объект класса B создасться новый и так по кругу пока память не закончится.
  • rider-sx

    Сообщения: 2706 Репутация: N Группа: Адекваты

    Spritz 30 ноября 2010 г. 12:01, спустя 10 минут 36 секунд

    в A::get ты вызываешь конструктор B который снова вызывает A::get….
    Покажи код который использует эти классы
  • wats

    Сообщения: 134 Репутация: N Группа: Кто попало

    Spritz 30 ноября 2010 г. 12:12, спустя 11 минут

    rider-sx, смысл в том, что бы в один результат можно было вставить другой, например есть контроллер страниц, сначало мы в конструкторе задаем главную страницу, которая будет выводится по умолчанию, затем в этом же конструкторе при помощи A::get указываем другую страницу которая будет вставлена как блок в главную страницу этим же контроллером.
  • wats

    Сообщения: 134 Репутация: N Группа: Кто попало

    Spritz 30 ноября 2010 г. 12:18, спустя 6 минут 3 секунды

    обьяснил как то коряво, но смысл думаю понятен. Тут надо как то отлавливать результат что ли, если он уже был выполнен то не создавать новый объект класса B а возвращать результат
  • rider-sx

    Сообщения: 2706 Репутация: N Группа: Адекваты

    Spritz 30 ноября 2010 г. 12:31, спустя 13 минут 31 секунду

    Код покажи а >_<
  • wats

    Сообщения: 134 Репутация: N Группа: Кто попало

    Spritz 30 ноября 2010 г. 12:40, спустя 9 минут 9 секунд

    rider-sx, кода до хрена, там core-классы, контроллеры, экшены и шаблонизатор участвуют. Суть проблемы я показал.
  • soul

    Сообщения: 790 Репутация: N Группа: Кто попало

    Spritz 30 ноября 2010 г. 16:09, спустя 3 часа 28 минут 29 секунд

    Второй класс тоже делаешь как я показал и все. Ты так объяснил задачу, что я ничего не понял. Наверняка нужно делать совсем по другому.
  • master

    Сообщения: 3242 Репутация: N Группа: Джедаи

    Spritz 30 ноября 2010 г. 19:33, спустя 3 часа 24 минуты 4 секунды

    Наверняка нужно делать совсем по другому

    иметь другую профессию, жить в другой стране или на другой планете
    не всё полезно, что в swap полезло
  • rider-sx

    Сообщения: 2706 Репутация: N Группа: Адекваты

    Spritz 30 ноября 2010 г. 23:47, спустя 4 часа 14 минут 17 секунд

    Епт, как помочь тебе изменить A класс не знаю как ты его там используешь? Не понятно какой из классов ты дергаешь в рабочем коде, поэтому и не понятно в каком классе бороться с беконечным вызовом, и это не рекурсия вроде))

Пожалуйста, авторизуйтесь, чтобы написать комментарий!