Component理解
来源:互联网 发布:qq酷双项淘宝客 编辑:程序博客网 时间:2024/06/05 07:21
以下是Component小demo。
<?phpclass Event { public $name; public $data;}abstract class Component { private static $_events = []; public function on($name, $handler, $data = null) { self::$_events[$name][] = [$handler, $data]; } public function trigger($name) { $event = new Event;$event->name = $name; foreach (self::$_events[$name] as $handler) { // 构造event $event->data = $handler[1]; call_user_func($handler[0], $event); } } }class Person extends Component { const EVENT_HELLO = 0; public function hello($event) { echo "hello: ".$event->data."\n"; }}$myComponent = new Person();$myComponent->on(Person::EVENT_HELLO, [$myComponent, 'hello'], " lee");$myComponent->trigger(Person::EVENT_HELLO);
###########
在trigger的时候,动态绑定一个数据。
<?phpclass Event { public $name; public $data;}abstract class Component { private static $_events = []; public function on($name, $handler, $data = null) { self::$_events[$name][] = [$handler, $data]; } public function trigger($name, $event = null) { if ($event === null) { public $data;}abstract class Component { private static $_events = []; public function on($name, $handler, $data = null) { self::$_events[$name][] = [$handler, $data]; } public function trigger($name, $event = null) { if (!empty(self::$_events[$name])) { if ($event === null) { $event = new static;<?phpclass Event { public $name; public $data;}abstract class Component { private static $_events = []; public function on($name, $handler, $data = null) { self::$_events[$name][] = [$handler, $data]; } public function trigger($name, $event = null) { if (!empty(self::$_events[$name])) { if ($event === null) { $event = new static; } $event->name = $name; foreach (self::$_events[$name] as $handler) { $event->data = $handler[1]; call_user_func($handler[0], $event); } } } }class Person extends Component { const EVENT_HELLO = 0; public function hello($event) { echo "hello: ".$event->data."\n"; echo "publicTime: ".$event->publicTime."\n"; }}$myComponent = new Person();$publicEvent = new Event;$publicEvent->publicTime = '2016-05-21 14:39:05';$myComponent->on(Person::EVENT_HELLO, [$myComponent, 'hello'], " lee");$myComponent->trigger(Person::EVENT_HELLO, $publicEvent);
##############
在event添加是否handled字段,如果设定为handled=true, 则不继续处理。
<?phpclass Event { public $name; public $data; public $handled;}abstract class Component { private static $_events = []; public function on($name, $handler, $data = null) { self::$_events[$name][] = [$handler, $data]; } public function trigger($name, $event = null) { if (!empty(self::$_events[$name])) { if ($event === null) {class Event { public $name; public $data; public $handled;}abstract class Component { private static $_events = []; public function on($name, $handler, $data = null) { self::$_events[$name][] = [$handler, $data]; } public function trigger($name, $event = null) { if (!empty(self::$_events[$name])) { if ($event === null) { $event = new static; } $event->name = $name; $event->handled = false; // 设置时间未处理 foreach (self::$_events[$name] as $handler) { $event->data = $handler[1]; call_user_func($handler[0], $event); if ($event->handled) { // 如果handler 设置handled为true,表示不继续处理下去 return; } } } }}class Person extends Component { const EVENT_HELLO = 0; public function hello($event) { echo "hello: ".$event->data."\n"; echo "publicTime: ".$event->publicTime."\n"; // 设置不继续处理下去 $event->handled = true; } } $myComponent = new Person();$publicEvent = new Event;$publicEvent->publicTime = '2016-05-21 14:39:05';$myComponent->on(Person::EVENT_HELLO, [$myComponent, 'hello'], " lee");$myComponent->trigger(Person::EVENT_HELLO, $publicEvent);################
class-level event
类级别事件,不是由某个类的实例来注册,而是由类来注册,这样,所有类的实例都能够处理这个事件。
<?phpclass Event { public $name; public $data; public $handled; // global class-level Events private static $_events = []; // 归属于那个类 public static function on($class, $name, $handler, $data = null) { $class = ltrim($class, '\\'); if (empty(self::$_events[$name])) { self::$_events[$name][$class][] = [$handler, $data]; } else { array_unshift(self::$_events[$name][$class], [$handler, $data]); } } public static function trigger($class, $name, $event = null) { if (empty(self::$_events[$name])) { return; } if ($event === null) { $event = new static; } $event->name = $name; $event->handled = false; if (is_object($class)) { $class = get_class($class); } else { $class = ltrim($class, '\\'); } // 获取所有父类,子类,当前类 $classes = array_merge( [$class], class_parents($class, true), class_implements($class, true) ); foreach ($classes as $class) { if (!empty(self::$_events[$name][$class])) { foreach (self::$_events[$name][$class] as $handler) { $event->data = $handler[1]; call_user_func($handler[0], $event); if ($event->handled) { return; } } } } }}abstract class Component {private static $_events = [];public function on($name, $handler, $data = null) {self::$_events[$name][] = [$handler, $data];} public function trigger($name, $event = null) { if (!empty(self::$_events[$name])) { if ($event === null) { $event = new static; } $event->name = $name; $event->handled = false; foreach (self::$_events[$name] as $handler) { $event->data = $handler[1]; call_user_func($handler[0], $event); if ($event->handled) { return; } } } // 是否有类全局事件处理 Event::trigger($this, $name, $event); }}class Person extends Component { const EVENT_HELLO = 0; public static function hello($event) { echo "hello: ".$event->data."\n"; echo "publicTime: ".$event->publicTime."\n"; $event->handled = true; }}Event::on('Person', Person::EVENT_HELLO, ['Person', 'hello'], " lee");$myComponent = new Person();$publicEvent = new Event;$publicEvent->publicTime = '2016-05-21 14:39:05';$myComponent->trigger(Person::EVENT_HELLO, $publicEvent);
只需要全局注册一个事件,类的实例都可以使用这个事件了。
其他细节,如off等,参考yii的源码
0 0
- Component理解
- Windows Runtime Component理解
- Yii2 理解Component
- 理解Html DOM、Ext Element及Component
- 关于JSF2 composite component一点理解
- Extjs 理解Html DOM、 Element及Component
- PCA(Principal Component Analysis)之个人理解
- 理解Html DOM、Ext Element及Component
- Robust principal component analysis?(RPCA简单理解)
- @Component
- Component
- component
- @component
- TTCN3新执行器系列-对component的理解
- 理解Joomla的component、module和plugin之间的关系
- @Component-@Resource-@Repository-@Service-@Controller的区别和理解-------springMVC
- 个性化学习之"知识组件"[Knowledge component]的理解
- 彻底理解PCA(Principal Component Analysis)主成分分析
- 在一个数组中找差值最大数对,输出最大差值
- 数组
- 【算法总结系列-1】快速排序-c语言实现
- poj 2356 Find a multiple(鸽巢原理)
- 判断一个链表是否为回文结构
- Component理解
- python
- Android之Bundle类
- 哈理工OJ 1029 Function Run Fun(记忆思想)
- 剑指offer(二十八)之丑数
- jquery中Callbacks对象的实现
- ubuntu16.04为firefox添加pepperflash插件
- 构建高性能 ASP.NET应用的12点建
- HDU3727 Jewel(主席树)