毎日学習ノート(9)


1,PHPのコールバック関数は有用な構文であり,ビジネスオブジェクトをそれに付加された処理ロジックから分離することができ,これも観察者モードの実現である.
 

  
  
  
  
  1. <?php 
  2. class Product 
  3.     public $name
  4.     public function __construct($name
  5.     { 
  6.         $this->name = $name
  7.     } 
  8. class Processor 
  9.     private $callbacks = array(); 
  10.     public function registerCallback($callback)  
  11.     { 
  12.         if ( !is_callable($callback)) { 
  13.             throw new Exception("not callable"); 
  14.         } 
  15.         $this->callbacks[] = $callback
  16.     } 
  17.     public function process($product)  
  18.     { 
  19.         foreach($this->callbacks as $callback) { 
  20.             call_user_func($callback$product); 
  21.         } 
  22.     } 
  23. class Mailer 
  24.     public function sendMail($product)  
  25.     { 
  26.         print "mailing ({$product->name})
    "
  27.     } 
  28. $logger = create_function('$product''print "loggint({$product->name})
    ";'
    ); 
  29. $processor = new Processor(); 
  30. $processor->registerCallback($logger); 
  31. $processor->registerCallback(array(new Mailer(), "sendMail")); 
  32. $processor->process(new Product("pen")); 
  33. ?> 

PHP 5.3には匿名関数も導入されているので、上記のログ関数は以下の形式で代用できます.
 

  
  
  
  
  1. $logger = function($product) { 
  2. print "loggint({$product->name})
    "
  3. }; 

2,PHP5.3以前のバージョンではpackageという構文はありませんでしたが、一般的にはフォルダでクラスファイルを区切ってrequire_onceまたはinclude_onceはファイルを含みます.Includeとrequireの2つの方法の違いは,エラーに対する処理が異なることである.Requireに含まれるファイルは、エラーが発生するとプログラム全体が停止し、includeは警告情報のみが発生し、呼び出しスクリプトが停止することはありません.したがって、セキュリティから言えばrequire_onceのほうがいいです.手元のコードをチェックしたところ、includeを使っているところがいくつかありました.once、この点は改めるべきだ.