====== PHP Замыкания ======

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

==== Примеры ====

<code 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) );
</code>

=== Use ===

<code php>
$param = 'Мир';

$func = function ($t = '') use ($param){
    print "$t $param\n";
};

echo $func('Привет');
</code>


