Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Событие в классе PHP
 
 автор: bas01   (11.03.2014 в 13:25)   письмо автору
 
 

Как реализовать событие для класса написанного на PHP?
задача заключается в чтом, чтоб к экземпляру класса можно было присвоить функцию с реализацией

  Ответить  
 
 автор: psychomc   (11.03.2014 в 13:46)   письмо автору
 
   для: bas01   (11.03.2014 в 13:25)
 


<?php
class event
{
   protected static 
$events = array();

    
// ...
   
public static function on($event$callback) {
       
// ...
   
}

   public static function 
trigger($event) {
       
// ...
   
}
}

class 
foo 
{
    
// ...

    
public function __construct() {
        
// ...
    
}
    
    public function 
test_event() {
        
event::trigger('test');
    }
}

event::on('test', function() {
     echo 
'Test event';
});

$foo = new foo;
$foo->test_event();

  Ответить  
 
 автор: bas01   (11.03.2014 в 15:28)   письмо автору
 
   для: psychomc   (11.03.2014 в 13:46)
 

on и trigger - это специальные слова?


нифига не понял где почитать об этом можно?

из того что написано понял только то что как в джава скрипте можно функцию передавать в виде параметра

а то что $foo->test_event(); - это просто вызов метода предка это как событие работать не может

и не показан где вызывается метод $callback

  Ответить  
 
 автор: Alph[p]a   (11.03.2014 в 15:43)   письмо автору
 
   для: bas01   (11.03.2014 в 15:28)
 

задача заключается в чтом, чтоб к экземпляру класса можно было присвоить функцию с реализацией


Вы извините но зачем это понадобилось?)

  Ответить  
 
 автор: bas01   (11.03.2014 в 16:39)   письмо автору
 
   для: Alph[p]a   (11.03.2014 в 15:43)
 

есть базовый класс где описывается логика, например сохранение данных
хочется в модуле, где создается экземпляр этого класса , сделать реализауию события вызываемого перед сохранением типа как onbeforpost как в delphi чтоб там прописать какую-нибудь проверку или еще что-нить я понимаю что на серваке делать проверку не совсем гуд но все же, на js проверку делать тоже как-то не комильфо

  Ответить  
 
 автор: psychomc   (11.03.2014 в 17:01)   письмо автору
 
   для: bas01   (11.03.2014 в 16:39)
 

то что я написал - это именно то, что вам нужно. только я описал интерфейс класса, без реализации методов. попробуйте написать реализацию сами

  Ответить  
 
 автор: bas01   (11.03.2014 в 17:47)   письмо автору
 
   для: psychomc   (11.03.2014 в 17:01)
 

что за методы on и trigger ? названия взяты от балды?

  Ответить  
 
 автор: psychomc   (11.03.2014 в 18:28)   письмо автору
 
   для: bas01   (11.03.2014 в 17:47)
 

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

  Ответить  
 
 автор: psychomc   (11.03.2014 в 17:00)   письмо автору
 
   для: bas01   (11.03.2014 в 15:28)
 

мде. ну так и передавайте название функции как параметр в виде строки или массива. а для вызова функции внутри класса используйте call_user_func/call_user_func_array. в мануале написано как ими пользоваться

  Ответить  
 
 автор: bas01   (11.03.2014 в 17:46)   письмо автору
 
   для: psychomc   (11.03.2014 в 17:00)
 

это извращение, т.к. хотелось бы чтоб было в рамках ООП
иначе придется создавать уникальные названия методов для каждого экземпляра и отслеживать чтоб не повторялись - это полная Ж!!!!

  Ответить  
 
 автор: psychomc   (11.03.2014 в 18:30)   письмо автору
 
   для: bas01   (11.03.2014 в 17:46)
 

это не изварещение. а отследить очень просто, нужно использовать массив

  Ответить  
 
 автор: bas01   (11.03.2014 в 23:19)   письмо автору
 
   для: psychomc   (11.03.2014 в 18:30)
 

из самоката делать космический корабль?

  Ответить  
 
 автор: bas01   (11.03.2014 в 18:20)   письмо автору
 
   для: psychomc   (11.03.2014 в 13:46)
 

Пример #1 Примеры callback-функций

// пример callback-функции
function my_callback_function() {
echo 'hello world!';
}

// пример callback-метода
class MyClass {
static function myCallbackMethod() {
echo 'Hello World!';
}
}

// Вариант 1: простой вызов callback
call_user_func('my_callback_function');

// Вариант 2: вызов статического метода класса
call_user_func(array('MyClass', 'myCallbackMethod'));

// Вариант 3: вызов метода объекта
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));

// Вариант 4: вызов статического метода класса (с версии PHP 5.2.3)
call_user_func('MyClass::myCallbackMethod');

// Вариант 5: вызов относительного статического метода класса (с версии PHP 5.3.0)
class A {
public static function who() {
echo "A\n";
}
}

class B extends A {
public static function who() {
echo "B\n";
}
}

call_user_func(array('B', 'parent::who')); // A

Пример #2 Пример callback-вызова с использованием замыканий

// наше замыкание
$double = function($a) {
return $a * 2;
};

// это наш диапазон чисел
$numbers = range(1, 5);

// Используем здесь замыкание в качестве callback-функции
// для удвоения размера каждого элемента в диапазоне
$new_numbers = array_map($double, $numbers);

print implode(' ', $new_numbers);

  Ответить  
 
 автор: bas01   (11.03.2014 в 23:15)   письмо автору
 
   для: psychomc   (11.03.2014 в 13:46)
 

решил так:

определение события и создание экземпляра:

class editors1 extends editors {

// обратный вызов этой функции
function beforupdate() {
echo '0000000000';
}

}

$editors = new editors1;

реализация в классе:

function post()
{

global $editors;

if (isset($editors))
if (method_exists($editors, 'beforupdate'))
$editors->beforupdate();

//........
}

  Ответить  
 
 автор: psychomc   (12.03.2014 в 00:50)   письмо автору
 
   для: bas01   (11.03.2014 в 23:15)
 

лажа. глобальные переменные это зло, метод beforupdate живет своей жизнью и не понятно к чему относится. не понимаю вашего странного упорства, вот просто рабочий пример по первой же ссылке

<?php
/*
 Example 1: 
 event::bind('blog.post.create', function($args = array())
 {
    mail('myself@me.com', 'Blog Post Published', $args['name'] . ' has been published');
});

 Example 2: 
 event::trigger('blog.post.create', $postInfo);
*/

class event
{
    public static 
$events = array();

    public static function 
trigger($event$args = array())
    {
        if(isset(
self::$events[$event]))
        {
            foreach(
self::$events[$event] as $func)
            {
                
call_user_func($func$args);
            }
        }

    }

    public static function 
bind($eventClosure $func)
    {
        
self::$events[$event][] = $func;
    }
}


http://stackoverflow.com/questions/4471183/php-event-listener-best-practice-implementation

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования