Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: создание событий для класса

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: идея хорошая, но есть проблемы с реализацией :(
boxoda
Отправлено: 19 Марта, 2010 - 15:30:13
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Март 2010  


Помог: 0 раз(а)




Идея состоит в том, чтобы созданному объекту можно было присвоить свой обработчик событий.
вот код приблизительной реализации:
PHP:
скопировать код в буфер обмена
  1. class A{
  2.         var $on_success=null; //допустим это событие возникающие при успешном выполнении какого-то функционал класса
  3.         function fun(){
  4.                 //что-то делаем
  5.                 //у нас это получилось и мы хотим сгенерировать событие успеха
  6.                 if (isset($this->on_success)){
  7.                         $this->on_success('message');
  8.                 }
  9.                 else{
  10.                         echo 'not report'; //это вывод для тестирования
  11.                 }
  12.         }
  13. }
  14.  
  15. $obj=new A;
  16. $obj->on_success=my_notify;
  17. $obj->fun();
  18. ?>

но при его выполнении возникает ошибка
Fatal error: Call to undefined method A::on_success() в строке №17 $this->on_success('message');
и понятно почему :)
вопрос в том как сделать так чтоб такая идея была рабочая?

если кого-то заинтересовала данная идея, буду благодарен за помощь !

реализовывая этот подход я основывался из соображений работоспособности вот этого кода
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. function my_fun($message){
  3.         echo $message;
  4. }
  5. $f=my_fun;
  6. echo $f('hello');
  7. ?>
 
 Top
Stierus Супермодератор
Отправлено: 19 Марта, 2010 - 16:05:43
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Цитата:
реализовывая этот подход я основывался из соображений работоспособности вот этого кода
тот код тоже не работает Улыбка а Вот если поставишь
- то будет рабочий Улыбка Только это совершенно разные вещи Улыбка

$this->on_success('message'); - ты обращаешься к методу, который не описал ... тебе поможет call_user_func
 
My status
 Top
kochan10
Отправлено: 19 Марта, 2010 - 17:14:22
Post Id


Гость


Покинул форум
Сообщений всего: 118
Дата рег-ции: Дек. 2009  


Помог: 0 раз(а)




PHP:
скопировать код в буфер обмена
  1. //Наверно в таком случае стоит написать
  2. echo $this->on_success;
  3. //Вместо
  4. $this->on_success('message');
 
 Top
boxoda
Отправлено: 19 Марта, 2010 - 18:53:59
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Март 2010  


Помог: 0 раз(а)




Цитата:
тот код тоже не работает а Вот если поставишь

а у меня работает ! даже если без кавычек.

уже разобрался. Stierus - спасибо за помощь ! мне помогло то, что вы напомнили мне про call_user_func()

рабочий код будет таким:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. function my_notify($message){
  3.         echo $message;
  4. }
  5. class A{
  6.         var $on_success=null; //допустим это событие возникающие при успешном выполнении какого-то функционал класса
  7.         function fun(){
  8.                 //что-то делаем
  9.                 //у нас это получилось и мы хотим сгенерировать событие успеха
  10.                 if (isset($this->on_success)){
  11.                         call_user_func($this->on_success, 'message');
  12.                 }
  13.                 else{
  14.                         echo 'not report'; //это вывод для тестирования
  15.                 }
  16.         }
  17. }
  18.  
  19. $obj=new A;
  20. $obj->on_success='my_notify';
  21. //если это метод созданного объекта, то
  22. //$obj->on_success=array(obj_name, fun_name);
  23. $obj->fun();
  24. ?>
 
 Top
JustUserR
Отправлено: 19 Марта, 2010 - 19:14:05
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




boxoda Можно вообще использовать обработчик __call и динамически устанавливать любые функции в качестве обработчика - как обычные так и созданные lambda-функции и помещенные вовнутрь инстанции класса


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
boxoda
Отправлено: 19 Марта, 2010 - 19:19:05
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Март 2010  


Помог: 0 раз(а)




почитал про __call и понял -
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Радость
 
 Top
JustUserR
Отправлено: 20 Марта, 2010 - 11:39:21
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




boxoda пишет:
Почитал про __call и понял - Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Цитируете классика Улыбка
Что касается самого lambda-функций и проблемы обработчика событий то дело в следующем - как правило в качество обработчика события передается новая или динамически создаваемая функция - но в PHP фукнция это не объект первого рода и поэтому надо либо передавать имя фукнции и вызывать ее с помощью call_user_func (Но это не совсем хорошо потому что она будет вызываться безлично от класса Улыбка а можно использовать динамическую генерацию функций в инстанции класса (Что вообще позволяет обращаться к переменным класса Улыбка


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
boxoda
Отправлено: 20 Марта, 2010 - 13:01:16
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Март 2010  


Помог: 0 раз(а)




Динамическое создание функций это конечно хорошо и на многое развязывает руки, но для данной цели - создания обработчиков для класса, классу достаточно знать только какую функцию ему следует вызвать и какие аргументы ей передать. и совсем не нужно предоставлять ей доступ к своим свойствам.
Что я подразумеваю под обработчиками для класса - это как к примеру обработчик для визуального компонента onClick. Если кто-то там щёлкает по объекту этого класса, объект генерирует событие, при этом вызывая ту функцию которую пользователь объекта записал в свойство onClick и передаёт ей аргументы сообщающее об координатах.
Это я на всякий случай описал, чтоб быть уверенным в понимании преследуемых мною целей )
А читая о __call я понял, что - вау, какая классная и удобная штука ! Но практическую цель для себя в ней я ещё не придумал )
 
 Top
JustUserR
Отправлено: 20 Марта, 2010 - 16:22:35
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




boxoda пишет:
Классу достаточно знать только какую функцию ему следует вызвать и какие аргументы ей передать. и совсем не нужно предоставлять ей доступ к своим свойствам
То есть если ваше событие не привязано к конкретному экземпляру класса а точнее к его свойстам то можно сделать как и вы сделали - я же привел вам метод решения в том случае если нужно сделать динамическую привязку функции к конкретной инстанции класса (Именно инстанции а не экзампляру потому что есть небольшая разница при создании create_function и прямой вставке через eval к примеру Улыбка
boxoda пишет:
Это я на всякий случай описал, чтоб быть уверенным в понимании преследуемых мною целей
Понятно но можт вам пригодится и это Улыбка
boxoda пишет:
А читая о __call я понял, что - вау, какая классная и удобная штука ! Но практическую цель для себя в ней я ещё не придумал )
В последнее время я все чаще замечаю что многие любят создавать экземпляр к экземпляре (Что не совсем верно идеологически ООП но вполне допустимо Улыбка и тогда __call можно использовать для неявного вызова методов внутреннего экземпляра чтобы пользователя не узнал о его существовании


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Stierus Супермодератор
Отправлено: 22 Марта, 2010 - 11:01:47
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




конкретно в этом случае __call избыточен, а так полезная штука, кто спорит Улыбка
 
My status
 Top
boxoda
Отправлено: 22 Марта, 2010 - 11:07:14
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Март 2010  


Помог: 0 раз(а)




и ещё, что касается этого примера, если будет нужно сделать возможным обработчику обращаться к полям объекта его вызвавшим, то можно передать ему в качестве аргумента ссылку this.

а __call всё равно класная штука Улыбка
 
 Top
JustUserR
Отправлено: 22 Марта, 2010 - 17:19:49
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




boxoda пишет:
И ещё, что касается этого примера, если будет нужно сделать возможным обработчику обращаться к полям объекта его вызвавшим, то можно передать ему в качестве аргумента ссылку this
В случае если указаную функцию обработчика событий вызывает другая функция из данного экземпляра то да Но все равно неплохо положить получекнную функцию прямо вовнутрь инстанции класса


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB