不知道是啥

<?php

class Event {
	public $handler;
	public $target;
	public $closure;
	public $priority;

	function __construct( $handler, $target, $closure, $priority = 0 ) {
		$this->handler  = $handler;
		$this->target   = $target;
		$this->closure  = $closure;
		$this->priority = $priority;
	}
}

class EventListener {
	public $eventCollections = array();

	function listen( $handler, $target, Closure $closure, $priority = 0 ) {
		if ( is_a( $target, 'Prototype' ) ) {
			$target->eventListener->eventCollections[ $handler ][ $priority ][] = $target->component->$handler( $closure, $priority );
		} else {
			$target->eventListener->eventCollections[ $handler ][ $priority ][] = $target->$handler( $closure, $priority );
		}
		ksort( $target->eventListener->eventCollections[ $handler ] );
	}

	function fire( $handler, $target, array $data ) {
		$eventCollections = $target->eventListener->eventCollections;
		if ( is_a( $target, 'Component' ) && ! empty( $target->prototype->eventListener->eventCollections[ $handler ] ) ) {
			array_walk_recursive( $target->prototype->eventListener->eventCollections[ $handler ], function ( $event ) use ( $target, & $eventCollections ) {
				$eventCollections[ $event->handler ][ $event->priority ][] = $target->{$event->handler}( $event->closure, $event->priority );
			} );
			ksort( $eventCollections[ $handler ] );
		}
		array_walk_recursive( $eventCollections[ $handler ], function ( $event ) use ( $data ) {
			$event->data = $data;
			$closure     = $event->closure;
			$closure( $event );
		} );
	}
}

class Prototype {
	public $component;
	public $eventListener;

	public function __construct( $component ) {
		$this->component     = $component;
		$this->eventListener = new EventListener();
	}

	public function __call( $method, $args = array() ) {
		if ( isset( $this->$method ) && is_a( $this->$method, 'Closure' ) ) {
			$func = $this->$method;
			$func( $args, $this );
		}
	}
}

class PrototypeFactory {
	static $prototypeCollections;

	static function make( $component ) {
		$component = is_string( $component ) ? new $component : $component;
		isset( self::$prototypeCollections[ get_class( $component ) ] ) or self::$prototypeCollections[ get_class( $component ) ] = new Prototype( $component );

		return self::$prototypeCollections[ get_class( $component ) ];
	}
}

class Component {
	public $eventListener;
	public $prototype;

	function __construct() {
		$this->eventListener = new EventListener();
	}

	function __call( $func, $args ) {
		return $this->prototype->$func( $args );
	}
}

class Button extends Component {
	public $id;

	function __construct( $id ) {
		parent::__construct();
		$this->prototype = PrototypeFactory::make( $this );
		$this->id        = $id;
	}

	function someFunc() {
		$this->eventListener->listen( 'onclick', $this, function ( $event ) {
			echo get_class( $this ) . ' [' . $this->id . '] click priority:' . $event->priority . '<br />';
		}, 11 );
		$this->eventListener->listen( 'ondbclick', $this, function ( $event ) {
			echo get_class( $this ) . ' [' . $this->id . '] dbclick priority:' . $event->priority . '<br />';
		}, 11 );
	}

	function onclick( Closure $closure, $priority = 0 ) {
		return new Event( 'onclick', $this, $closure, $priority );
	}

	function ondbclick( Closure $closure, $priority = 0 ) {
		return new Event( 'ondbclick', $this, $closure, $priority );
	}

	function click( Closure $closure = null ) {
		$this->eventListener->listen( 'onclick', $this, $closure ? $closure : function ( $event ) {
			echo get_class( $this ) . ' [' . $this->id . '] click default priority:' . $event->priority . '<br />';
		}, 10 );
		$this->eventListener->fire( 'onclick', $this, array( 'clickbtnVal' ) );
	}

	function dbclick( Closure $closure = null ) {
		$this->eventListener->listen( 'ondbclick', $this, $closure ? $closure : function ( $event ) {
			echo get_class( $this ) . ' [' . $this->id . '] dbclick default priority:' . $event->priority . '<br />';
		}, 10 );
		$this->eventListener->fire( 'ondbclick', $this, array( 'dbclickbtnVal' ) );
	}
}

$button  = new Button( 'btn1' );
$button2 = new Button( 'btn2' );

$button->prototype->prototypeBindListens = function ( $data, $prototype ) {
	$prototype->eventListener->listen( 'onclick', $prototype, function ( $event ) {
		echo get_class( $event->target ) . ' [' . $event->target->id . '] click bind from prototype priority:' . $event->priority . '<br />';
	}, 9 );
	$prototype->eventListener->listen( 'ondbclick', $prototype, function ( $event ) {
		echo get_class( $event->target ) . ' [' . $event->target->id . '] dbclick bind from prototype priority:' . $event->priority . '<br />';
	}, 11 );
};

$button->prototypeBindListens();
$button->someFunc();
$button->click();
$button->dbclick();

$button2->prototypeBindListens();
$button2->someFunc();
$button2->click( function ( $event ) {
	echo get_class( $event->target ) . ' [' . $event->target->id . '] click bind from runTime priority:' . $event->priority . '<br />';
} );
$button2->dbclick();


你可能感兴趣的:(不知道是啥)