PHP5.3 рдореЗрдВ рдирдпрд╛
рдЕрдирд╛рдо рд╕реБрд╡рд┐рдзрд╛рдПрдБред
рдмреЗрдирд╛рдореА рдлрд╝рдВрдХреНрд╢рди рд╣рдореЗрдВ рдореБрдЦреНрдп рдХреЛрдб рдореЗрдВ рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдХреА рдШреЛрд╖рдгрд╛ рдХрд┐рдП рдмрд┐рдирд╛, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЙрд▓рдмреИрдХ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
__inoke ()
рдирдИ рдЬрд╛рджреВ рдкрджреНрдзрддрд┐ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╣рдо рдЙрд╕ рдШрдЯрдирд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рддрдм рд╣реЛрддреА рд╣реИ рдЬрдм рдХреЛрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╡рд░реНрдЧ рдШрдЯрдирд╛
рдЖрдЗрдП рдЗрд╡реЗрдВрдЯ рдХреНрд▓рд╛рд╕ рд╕реЗ рд╣реА рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдкрдврд╝рдирд╛ рдЦрд╛рд▓реА рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рдФрд░ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдЬреЛ рдореИрдВрдиреЗ рд╢реБрд░реБрдЖрдд рдореЗрдВ рджреЗрдЦрд╛ рдерд╛, рд╡рд╣ рдХрдиреЗрдХреНрдЯрд╡реЗрд╡реЗрдВрдЯ, рдЖрджрд┐ рдЬреИрд╕реЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдерд╛ред
рдЕрдкрдиреЗ рдкреНрд░рд╛рдХреГрддрд┐рдХ рдЖрд▓рд╕реНрдп рдХреЗ рдХрд╛рд░рдг, рдореИрдВ рдЗрд╕ рджрд┐рдирдЪрд░реНрдпрд╛ рдХреЛ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдФрд░ рдлрд┐рд░ рдореБрдЭреЗ рдЕрджреНрднреБрдд ArrayObject рд╡рд░реНрдЧ рдпрд╛рдж рдЖрдпрд╛, рдЬреЛ рдЖрдкрдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╕реАрдзреЗ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдФрд░ рд╕рд░рдгреА рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реБрдЖ:
<?php class Event extends ArrayObject { public function __invoke() { foreach($this as $callback) call_user_func_array($callback, func_get_args()); } }
рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдХреЙрд▓рдмреИрдХ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░реЗрдЧрд╛, рдФрд░ рдЬрдм рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░реЗрдЧрд╛, рддреЛ рдпрд╣ рдмрджрд▓реЗ рдореЗрдВ рд╕рднреА рдХреЙрд▓рдмреИрдХ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
<?php $test = new Event(); /* Setting up callbacks */ $test[] = function($msg, $txt) { echo "This is the event! <br />"; }; $test[] = function($msg, $txt) { echo "<b>Message</b>: $msg. <b>Text</b>: $txt <br />"; }; $test[] = function($msg, $txt) { echo "Works great! <br />"; }; /* call */ $test("Some message", "Some text");
рдЕрдм, рдпрд╣ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдмрд╕ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЕрд╡рд╢реЗрд╖ - рдХреБрдЫ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЬрдХрдбрд╝рдирд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред
рдХрдХреНрд╖рд╛ рдХрд╛ рдЖрдпреЛрдЬрди
рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ PHP рдХреНрд▓рд╛рд╕ рдореЗрдВ рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЦреЛрдЬрдиреЗ рдФрд░ рд╕рдВрдкрддреНрддрд┐ рдкрд░ __inoke рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛ред
рдЖрдк рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
class Test { public $onA; public function __construct() { $this->onA = new Event(); } public function A($txt) { $this->onA("This is A.", $txt); } } $test = new Test(); $test->onA[] = function($msg, $txt) { echo "This is the event! <br />"; }; $test->A("Le Test");
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЙрд╕ рд╡рд░реНрдЧ рдХреЛ рд╕рдордЭрд╛рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╡рд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рдХреЛрдИ рднреА рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдбрд░ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдмреИрд╕рд╛рдЦреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЕрдЧрд░ рдХреЛрдИ рдЗрд╕рд╕реЗ рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдмрд╣реБрдд рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛:
<?php class Eventable { public function __call($name, $args) { if( method_exists($this, $name) ) call_user_func_array(array(&$this, $name), $args); else if( isset($this->{$name}) && is_callable($this->{$name}) ) call_user_func_array($this->{$name}, $args); } }
рдЕрдм рдпрд╣ рд╕рдм рд╢реЗрд╖ рд╣реИ рдХрд┐ рдЯреЗрд╕реНрдЯ рдХреЛ рдЗрд╡реЗрдВрдЯ рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рдП рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЖрдирдВрдж рд▓рд┐рдпрд╛ рдЬрд╛рдП:
class Test extends Eventable { public $onA; public function __construct() { $this->onA = new Event(); } public function A($txt) { $this->onA("This is A.", $txt); } } $test = new Test(); /* setting up callbacks */ $test->onA[] = function($msg, $txt) { echo "This is the event! <br />"; }; $test->onA[] = function($msg, $txt) { echo "<b>Message</b>: $msg. <b>Text</b>: $txt <br />"; }; $test->onA[] = function($msg, $txt) { echo "Works great! <br />"; }; /* call */ $test->A("Le Test");
рд╡реИрд╕реЗ, рдХреЙрд▓рдмреИрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдк рди рдХреЗрд╡рд▓ рдЧреБрдордирд╛рдо рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдШреЛрд╖рд┐рдд рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХрдХреНрд╖рд╛ рдХреЗ рддрд░реАрдХреЗ рднреА!
$test->onA[] = "some_function"; $test->onA[] = array(&$some_object, "some_method");