|
|
|
| Как реализовать событие для класса написанного на PHP?
задача заключается в чтом, чтоб к экземпляру класса можно было присвоить функцию с реализацией | |
|
|
|
|
|
|
|
для: 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();
|
| |
|
|
|
|
|
|
|
для: psychomc
(11.03.2014 в 13:46)
| | on и trigger - это специальные слова?
нифига не понял где почитать об этом можно?
из того что написано понял только то что как в джава скрипте можно функцию передавать в виде параметра
а то что $foo->test_event(); - это просто вызов метода предка это как событие работать не может
и не показан где вызывается метод $callback | |
|
|
|
|
|
|
|
для: bas01
(11.03.2014 в 15:28)
| |
задача заключается в чтом, чтоб к экземпляру класса можно было присвоить функцию с реализацией
|
Вы извините но зачем это понадобилось?) | |
|
|
|
|
|
|
|
для: Alph[p]a
(11.03.2014 в 15:43)
| | есть базовый класс где описывается логика, например сохранение данных
хочется в модуле, где создается экземпляр этого класса , сделать реализауию события вызываемого перед сохранением типа как onbeforpost как в delphi чтоб там прописать какую-нибудь проверку или еще что-нить я понимаю что на серваке делать проверку не совсем гуд но все же, на js проверку делать тоже как-то не комильфо | |
|
|
|
|
|
|
|
для: bas01
(11.03.2014 в 16:39)
| | то что я написал - это именно то, что вам нужно. только я описал интерфейс класса, без реализации методов. попробуйте написать реализацию сами | |
|
|
|
|
|
|
|
для: psychomc
(11.03.2014 в 17:01)
| | что за методы on и trigger ? названия взяты от балды? | |
|
|
|
|
|
|
|
для: bas01
(11.03.2014 в 17:47)
| | если вы имеете представление что такое событие и что оно из себя представляет, то должны понимать откуда берутся названия | |
|
|
|
|
|
|
|
для: bas01
(11.03.2014 в 15:28)
| | мде. ну так и передавайте название функции как параметр в виде строки или массива. а для вызова функции внутри класса используйте call_user_func/call_user_func_array. в мануале написано как ими пользоваться | |
|
|
|
|
|
|
|
для: psychomc
(11.03.2014 в 17:00)
| | это извращение, т.к. хотелось бы чтоб было в рамках ООП
иначе придется создавать уникальные названия методов для каждого экземпляра и отслеживать чтоб не повторялись - это полная Ж!!!! | |
|
|
|
|
|
|
|
для: bas01
(11.03.2014 в 17:46)
| | это не изварещение. а отследить очень просто, нужно использовать массив | |
|
|
|
|
|
|
|
для: psychomc
(11.03.2014 в 18:30)
| | из самоката делать космический корабль? | |
|
|
|
|
|
|
|
для: 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); | |
|
|
|
|
|
|
|
для: 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();
//........
} | |
|
|
|
|
|
|
|
для: 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($event, Closure $func)
{
self::$events[$event][] = $func;
}
}
|
http://stackoverflow.com/questions/4471183/php-event-listener-best-practice-implementation | |
|
|
|