PHP Замыкания

Примеры

<?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('Привет');