YII的事件大致是这种:

  1. <?php
  2. /**
  3. * 事件产生类
  4. * Class EventGenerator
  5. */
  6. abstract class EventGenerator
  7. {
  8. private $ObServers = [];
  9. //增加观察者
  10. public function add(ObServer $ObServer)
  11. {
  12. $this->ObServers[] = $ObServer;
  13. }
  14. //事件通知
  15. public function notify()
  16. {
  17. foreach ($this->ObServers as $ObServer) {
  18. $ObServer->update();
  19. }
  20. }
  21. }
  22. /**
  23. * 观察者接口类
  24. * Interface ObServer
  25. */
  26. interface ObServer
  27. {
  28. public function update($event_info = null);
  29. }
  30. /**
  31. * 观察者1
  32. */
  33. class ObServer1 implements ObServer
  34. {
  35. public function update($event_info = null)
  36. {
  37. echo "观察者1 收到执行通知 执行完毕!\n";
  38. }
  39. }
  40. /**
  41. * 观察者1
  42. */
  43. class ObServer2 implements ObServer
  44. {
  45. public function update($event_info = null)
  46. {
  47. echo "观察者2 收到执行通知 执行完毕!\n";
  48. }
  49. }
  50. /**
  51. * 事件
  52. * Class Event
  53. */
  54. class Event extends EventGenerator
  55. {
  56. /**
  57. * 触发事件
  58. */
  59. public function trigger()
  60. {
  61. //通知观察者
  62. $this->notify();
  63. }
  64. }
  65. //创建一个事件
  66. $event = new Event();
  67. //为事件增加旁观者
  68. $event->add(new ObServer1());
  69. $event->add(new ObServer2());
  70. //执行事件 通知旁观者
  71. $event->trigger();

PHP原生拥有SplObserver观察者类:

  1. <?php
  2. class user implements splsubject{
  3. protected $observer = null;
  4. public function __construct()
  5. {
  6. $this->observer = new SplObjectStorage();
  7. }
  8. public function login()
  9. {
  10. $this->notify();
  11. echo '登录完毕';
  12. }
  13. //增加观察者
  14. public function attach(SplObserver $observer)
  15. {
  16. $this->observer->attach($observer);
  17. }
  18. //减少观察者
  19. public function detach(SplObserver $observer)
  20. {
  21. $this->observer->detach($observer);
  22. }
  23. //观察
  24. public function notify()
  25. {
  26. $this->observer->rewind();
  27. while ($this->observer->valid())
  28. {
  29. $observer = $this->observer->current();
  30. $observer->update($this);
  31. $this->observer->next();
  32. }
  33. }
  34. }
  35. //观察者猫
  36. class cat implements SplObserver {
  37. public function update(SplSubject $subject)
  38. {
  39. echo '小猫叫一下';
  40. }
  41. }
  42. //观察者狗
  43. class dog implements SplObserver {
  44. public function update(SplSubject $subject)
  45. {
  46. echo '小狗吼一声';
  47. }
  48. }
  49. //创建一个事件
  50. $user = new user();
  51. //为事件增加旁观者
  52. $user->attach(new cat());
  53. $user->attach(new dog());
  54. //执行事件 通知旁观者
  55. $user->login();