Заголовок сообщения: (и опять про) обработчики событий в PHP Добавлено: 28 Октябрь 2007, 22:37:14
У меня идея фикс: попробовать программировать в ПХП используя события.
И я не успокоюсь пока на своей шкуре не испробую это
Я хочу: - Разбить процедурный код на логические блоки (функции).
- Порядок определения функций не важен - это хорошо. Тогда как в процедурном коде часто один кусок программы должен сдедовать за другим.
- Не засорять глобальное пространство переменными. Временные переменные будут определяться внутри функции (обработчик события).
В примере: 1. Создаю класс Calculator 2. Создаю объект $objCalc (экземпляр класса Calculator)
3. Вызываю метод $objCalc->add() (допустим сложение 2-х чисел).
4. Это в свою очередь вызывает два обработчика событий:
- один в объекте: onResult() - другой в теле программы: objCalc_onResult()
Код:
<?php class Calculator {
private $_varname; // String. Имя переменной. Нужно что бы вызывать функцию с именем переменной.
function __construct($varname) { $this->_varname = $varname; }
function add() { // ….. код ….. $this->onResult(); }
function onResult() { // Обработчик события внутри класса // ….. код …..
// Вызвать обработчик события внутри программы $function = $this->_varname.'_onResult'; $function(); }
}
/* Создаем объект. ** Передаем конструктору имя переменной, ** что бы правильно называть функции-обработчики событий для этого объекта. ** К примеру: objCalc_onResult() */ $objCalc = new Calculator("objCalc");
$objCalc->add();
function objCalc_onResult() { // Обработчик события внутри программы echo "Hello World"; } ?>
Какие будут мнения ?
_________________ Тот, кто задает вопрос, глупец в течение пяти минут, тот, кто его не задает, глупец всю свою жизнь. (Китайская поговорка)
Мнений не будет. Будет вопрос: какую проблему мсье пытается решить этим спрсобом?
P.S. Добавлю лишь, что Вы понимаете концепцию "процедурного" программирования достаточно превратно. Это не считая того, что такого термина, в сущности, нет. Ввиду бессмысленности.
Crazy,
допустим у меня есть длинная программа в 10 экранов. В ней один кусок программы (который решает определенную задачу) - следует за другим куском программы. Часто порядок их исполнения имеет значение. Ничего кроме комментов их не разделяет.
Когда мне надо добавить новую функциональность, мне надо пролистать всю программу, что бы:
- понять куда лучше впихнуть новый код (что бы ничего не нарушило и что бы крашивше выглядело)
- просмотреть переменные, что бы не назначить таких же новых. Знаю что в PHP 6 или 5.3 - обещают сделать namespace.
Появилась идея разбить программу на функции которые одновременно были бы обработчиками событий моих объектов. Решается проблема с namespace, и программа логически разделена на функции.
_________________ Тот, кто задает вопрос, глупец в течение пяти минут, тот, кто его не задает, глупец всю свою жизнь. (Китайская поговорка)
допустим у меня есть длинная программа в 10 экранов. В ней один кусок программы (который решает определенную задачу) - следует за другим куском программы. Часто порядок их исполнения имеет значение. Ничего кроме комментов их не разделяет.
Хм. Это трудно. Кому-то все же придется тебе это сообщить... В общем, если кратко, с тех пор, как лет 50 назад придумали концепцию подпрограмм, поток сплошного текста в 10 экранов воспринимается... как бы это помягче сказать... Ну, в общем, когда я лет 20 назад такое написал -- меня честно спросили: я обкурился или я природный кретин? Признаться, я до сих пор думаю над этим вопросом...
Я думаю, он пытается намекнуть, что парадигма ООП предполагает использование более адекватных средств, чем "$function = $this->_varname.'_onResult'; $function(); ".
Хм. Это трудно. Кому-то все же придется тебе это сообщить... В общем, если кратко, с тех пор, как лет 50 назад придумали концепцию подпрограмм, поток сплошного текста в 10 экранов воспринимается... как бы это помягче сказать... Ну, в общем, когда я лет 20 назад такое написал -- меня честно спросили: я обкурился или я природный кретин? Признаться, я до сих пор думаю над этим вопросом...
Ну бывает такое редко. (маленьких экранов, этак 600x800 )
Так к чему мы возращаемся - обратно к функциям. Почему бы не создать функции - они же обработчики событий объектов?
Вопрос: как это сделать малой кровью? Без создания сложного фреймворка. Пример - это то что я пока додумался.
Меня убивает это место:
Код:
$objCalc = new Calculator("objCalc");
При вызове конструтора, первый параметр надо указывать имя переменной
Crazy писал(а):
Я думаю, он пытается намекнуть, что парадигма ООП предполагает использование более адекватных средств, чем "$function = $this->_varname.'_onResult'; $function(); ".
что то я туплю тут..
_________________ Тот, кто задает вопрос, глупец в течение пяти минут, тот, кто его не задает, глупец всю свою жизнь. (Китайская поговорка)
А вообще-то использовать модель событий (observer/subscriber) разумно в случаях асинхронной обработки, например, когда многопоточный процесс. В PHP-то вам она зачем? Чтобы избавиться от пятиэкранных листингов - разбейте на классы/функции и положите все в разные файлы, подцепляемые в основной через require.
Совершенно верно. Я не осуждаю вашу любовь к данному паттерну, я полностью ее разделяю. Вопрос в другом - зачем применять его в PHP? Вопрос в целесообразности. Я понимаю - JS, где можно сделать многопотоковость за счет симуляции вызова функций через setTimeout + стейт машины, Java с их лисенерами (там в общем-то и придумывать уже ничего не надо), да и любой другой язык, на котором можно реализовать многопотоковое приложение. Здесь беспорно данный механизм подписывания на события по большому счету является единственной возможностью вызова обработчиков событий.
Возвращаясь к вопросу топикстартера: А в PHP, где все происходит линейно, зачем городить этот огород?
Причем тут линейность? JS тоже линейное и однопотоковое.
События, это возможность оповещать о каких-то изменениях те объекты, которым, возможно, это будет интересно.
А в PHP, где все происходит линейно, зачем городить этот огород?
Паттерн Observer не имеет никакого отношение к "линейности" или "нелинейности". Его назначение очень простое:
Цитата:
Intent: Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.
товарищи,
я тут написал - а вы меня поправьте как новичка в патернах:
В архитектуре MVC, вьювер использует обзервер чтобы получать уведомления от модели.
Так как скрипт в вэбе - это программа которая загружается "с нуля" с каждым новым кликом,
то вьюверу достаточно один раз получить все уведомления что бы выдать страницу. Для этого обзервер не нужен.
Точнее в этом случае, вьювер уже не получает уведомления, а контроллер вызывает нужные вьювера, которые в свою очередь запрашивают модель о данных.
Если не ошибаюсь такая схема называется Model2
Но MVC это частный случай использования обзервера.
Этот паттерн (как и многие другие) направлен что бы ослабить связи между объектами. Мой (неудачный) код в начале топика как раз пример тому, где обзервер удачно вписывается.
Вообщем тут все сказано:
Цитата:
Intent: Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.
Crazy
_________________ Тот, кто задает вопрос, глупец в течение пяти минут, тот, кто его не задает, глупец всю свою жизнь. (Китайская поговорка)
Уровень доступа: Вы не можете начинать темы. Вы не можете отвечать на сообщения. Вы не можете редактировать свои сообщения. Вы не можете удалять свои сообщения. Вы не можете добавлять вложения.