好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

php实现事件监听与触发实例程序 - php高级应用

php实现事件监听与触发实例程序

闲来无事,想了想PHP如何实现事件监听,参考了jQuery的事件绑定思路,简单的实现了一下.

主要功能:1.绑定事件 支持一个事件绑定多个动作,支持绑定一次性事件,2.触发事件,3.注销事件

php实现事件监听与触发实例程序,代码如下:

class  Event   {        protected   static   $listens        =  array ();                public   static   function  listen( $event ,  $callback ,  $once =false){            if (! is_callable ( $callback ))  return  false;           self:: $listens [ $event ][]    =  array ( 'callback' => $callback ,  'once' => $once );            return  true;       }                public   static   function  one( $event ,  $callback ){            return  self::listen( $event ,  $callback , true);       }                public   static   function  remove( $event ,  $index =null){            if ( is_null ( $index ))               unset(self:: $listens [ $event ]);            else               unset(self:: $listens [ $event ][ $index ]);       }                public   static   function  trigger(){            if (!func_num_args())  return ;            $args                        = func_get_args();            $event                       =  array_shift ( $args );            if (!isset(self:: $listens [ $event ]))  return  false;            foreach (( array ) self:: $listens [ $event ]  as   $index => $listen ){                $callback                =  $listen [ 'callback' ];                $listen [ 'once' ] && self::remove( $event ,  $index );               call_user_func_array( $callback ,  $args );           }       }   } 以下是一些调用的例子:   // 增加监听walk事件    Event::listen( 'walk' ,  function (){        echo   "I am walking...n" ;   });   // 增加监听walk一次性事件    Event::listen( 'walk' ,  function (){        echo   "I am listening...n" ;   }, true);   // 触发walk事件    Event::trigger( 'walk' );   /*    I am walking...    I am listening...    */   Event::trigger( 'walk' );   /*    I am walking...    */       Event::one( 'say' ,  function ( $name = '' ){        echo   "I am {$name}n" ;   });       Event::trigger( 'say' ,  'deeka' );  // 输出 I am deeka    Event::trigger( 'say' ,  'deeka' );  // not run        class  Foo   {        public   function  bar(){            echo   "Foo::bar() is calledn" ;       }                public   function  test(){            echo   "Foo::foo() is called, agrs:" .json_encode(func_get_args()). "n" ;       }   }       $foo     =  new  Foo;       Event::listen( 'bar' ,  array ( $foo ,  'bar' ));   Event::trigger( 'bar' );       Event::listen( 'test' ,  array ( $foo ,  'test' ));   Event::trigger( 'test' , 1, 2, 3);       class  Bar   {        public   static   function  foo(){            echo   "Bar::foo() is calledn" ;       }   }       Event::listen( 'bar1' ,  array ( 'Bar' ,  'foo' ));   Event::trigger( 'bar1' );   //开源代码phpfensi.com   Event::listen( 'bar2' ,  'Bar::foo' );   Event::trigger( 'bar2' );     function  bar(){        echo   "bar() is calledn" ;   }       Event::listen( 'bar3' ,  'bar' );   Event::trigger( 'bar3' ); 

查看更多关于php实现事件监听与触发实例程序 - php高级应用的详细内容...

  阅读:46次