PHP Замыкания

Обратный вызов (calback)

Примеры

<?php class Product { public $name; public $price; function __construct($name, $price){ $this->name = $name; $this->price = $price; } } class ProcessSale { private $callbaks; function registerCallback( $callback ){ if( !is_callable( $callback ) ){ throw new Exception( "$callback - Функция не может быть вызвана" ); } $this->callbacks[] = $callback; } function sale( $product ){ print "{$product->name} обрабатывается ...\n"; foreach($this->callbacks as $callback){ call_user_func( $callback, $product ); } } } class CClass1 { function Method( Product $product ){ print "3 Обработчик {$product->name} обработан\n"; } } class CClass2 { static function Method( Product $product ){ print "4 Обработчик {$product->name} обработан\n"; } } class CClass3 { static function Method(){ return function ( Product $product ){ print "5 Обработчик {$product->name} обработан\n"; }; } } $logger = function ( Product $product ){ print "1 Обработчик {$product->name} обработан\n"; }; // $processor = new ProcessSale(); $processor->registerCallback( $logger ); $processor->registerCallback( function ( Product $product ){ print "2 Обработчик {$product->name} обработан\n"; } ); $processor->registerCallback( array(new CClass1, 'Method') ); $processor->registerCallback( array(new CClass2, 'Method') ); $processor->registerCallback( CClass3::Method() ); // Занесение продуктов $processor->sale( new Product('Джинсы', 45) ); $processor->sale( new Product('Куртка', 345) ); $processor->sale( new Product('Шапка', 23) );

Use

$param = 'Мир'; $func = function ($t = '') use ($param){ print "$t $param\n"; }; echo $func('Привет');