За последние 24 часа нас посетили 34406 программистов и 1709 роботов. Сейчас ищет 791 программист ...

Запрет повторной инициализации объекта

Тема в разделе "Прочие вопросы по PHP", создана пользователем NitroGenerate, 25 сен 2014.

  1. NitroGenerate

    NitroGenerate Новичок

    С нами с:
    25 сен 2014
    Сообщения:
    9
    Симпатии:
    0
    Доброго времени суток коллеги. Прошу помощи в ООП, так как оказалось я не особо силен в нем.
    Есть система, в ней есть контроллер страниц (главная, новости, аккаунт, регистрация и тд)
    Под каждый контроллер есть шаблон в котором есть возможность вывода виджетов - метод в контроллере
    Код (Text):
    1. protected function widget($wName, $params=array(), $returnData = false)
    2.     {
    3.         $widget = 'Widget'.$wName;
    4.         $widget = new $widget;
    5.  
    6.         foreach ($params as $name => $value)
    7.             $widget->$name = $value;
    8.  
    9.         $widget->init();
    10.         $out = $widget->run();
    11.  
    12.         if($returnData)
    13.             return $out;
    14.     }
    Написал свой виджет статистики, который выводит какой-нибудь js в футере который пуляет запрос на мой обработчик, регистрируя пользователя или обновляет...

    И вот тут случилась загвоздка. В своем виджете я сохраняю данные в куки, а так как виджет стартует после вывода контета в браузер, то куки я сохранить не могу.

    Я могу пильнуть контроллер и инициализировать виджет свой где-нибудь до вывода.
    результат работы виджета(js код), соберу в буфер своего виджета. Затем в шаблоне напрямую обращусь к статичному свойству виджета, без инициализации самого виджета.

    В результате у меня получиться корявый код, так как везде я инициализирую виджет как:
    А теперь будет
    Как можно переписать метод widget в контроллере, что бы, если класс инициализирован, то не инициализировать его снова, а тупо взять вызвать метод run() ?

    Не знаю, может в каждом виджете запилить статическое свойство, которое до инициализации имеет 0, а после 1, и прежде создавать новый экземпляр класса чекнуть это свойство, и исходя из исхода либо стартануть виджет, либо... синглтон =)
    Я в замешательстве... Прошу вашей помощи...
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    MVC-базу сами писали? Покажите код, который вызывает событие в контроллере. Чтоб такие вещи срабатывали, он должен работать через ob_start()
     
  3. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
  4. NitroGenerate

    NitroGenerate Новичок

    С нами с:
    25 сен 2014
    Сообщения:
    9
    Симпатии:
    0
    Хыиуду, Вы невнимательно читаете.

    mkramer, Да, MVC сами писали. К сожалению код весь показать не могу, но логику попытаюсь изъяснить.
    В контроллере есть банальный рендер, который:
    Соответственно в require() попадает шаблон страницы .php в котором вшит код вызова виджета:
    Код (Text):
    1. <?php $this->widget('widget'); ?>
    Естественно он стартует в контроллере метод widget() и передает ему название виджета.
    И мы его инициализируем (код в первом посте)
    Собственно сабж в том, как сказать методу widget() в контроллере, что виджет который он должен инициализировать, уже был инициализирован ранее и нам нужно его просто выполнить.
    Не хотелось бы синглтонить в каждом виджете, очень не хотелось бы.
     
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Всё, что интересно, показали. Поскольку вы используете ob_start(), реально первый echo, дающий какой-то вывод в браузер, в скрипте стоит гораздо позже кода формирования виджета, поэтому проблем с отправкой куков быть не должно. Если конечно до этого кода, который вы мне показали, не выполняется какой-нибудь echo (явный или не явный)