コールバック、匿名関数、および閉パッケージ

15263 ワード

(1) is_callable転送された値を検出するためにcall_user_funcまたはarray_walkなどの関数は、非常にスマートで、配列をテストすることができます.配列形式の有効なコールバックは、オブジェクトを最初の要素とし、方法名を2番目の要素とし、array('new SomeClass()','someFunc')に似ています.
次に例を用いて説明する.
 1 function a(){
 2 
 3 }
 4 
 5 $a = 'a';
 6 
 7 if(is_callable($a)){
 8 
 9     echo 'a is callable 
'; 10 11 } else { 12 13 echo 'a is not callable
'; 14 15 }

出力:
1 a is callable 
 1 class B{
 2 
 3     public function add($arg = []){
 4 
 5         echo 'sum: ' . ($arg[0] + $arg[1]) . '
'; 6 7 } 8 9 } 10 11 $c = [new B(), 'add']; 12 13 if(is_callable($c)){ 14 15 call_user_func($c, [1, 2]); 16 17 }

出力:
1 sum: 3

(2) array_walkは、配列内の各要素にユーザー定義関数を適用します.
例:
 1 $array = [1, 2, 3];
 2 
 3 function show($v, $k, $u){
 4 
 5     $v += 1;
 6 
 7     echo "u: {$u}, k: {$k}, v: {$v}
"; 8 9 } 10 11 array_walk($array, 'show', 'Jerry'); 12 13 echo '
';
14 
15 print_r($array);

この では、array_walk の のパラメータは 、2 のパラメータはコールバック 、3 はユーザカスタムパラメータであり、この ではshow の のパラメータは $arrayの 、2 のパラメータは $arrayのキー またはインデックス、3 のパラメータはユーザーカスタムパラメータであり、array_に するwalkの3 のパラメータは、この では のように されます.
 1 u: Jerry, k: 0, v: 2
 2 u: Jerry, k: 1, v: 3
 3 u: Jerry, k: 2, v: 4
 4 
 5 Array
 6 
 7 (
 8 
 9     [0] => 1
10 
11     [1] => 2
12 
13     [2] => 3
14 
15 )

show の が した に の $arrayの を に する は、show の のパラメータの に& アドレス を します. は のとおりです.
 1 $array = [1, 2, 3];
 2 
 3 function show(&$v, $k, $u){
 4 
 5     $v += 1;
 6 
 7     echo "u: {$u}, k: {$k}, v: {$v}
"; 8 9 } 10 11 array_walk($array, 'show', 'Jerry'); 12 13 echo '
';
14 
15 print_r($array);

$vの を し、 $arrayの を することで、 :
 1 u: Jerry, k: 0, v: 2
 2 u: Jerry, k: 1, v: 3
 3 u: Jerry, k: 2, v: 4
 4 
 5 Array
 6 
 7 (
 8 
 9     [0] => 2
10 
11     [1] => 3
12 
13     [2] => 4
14 
15 )

(3) call_user_funcは、その のパラメータをコールバック として し、 りのパラメータをコールバック のパラメータとして します.
 1 function d($a, $b, $c){
 2 
 3     echo "a: {$a}, b: {$b}, c: {$c}
"; 4 5 } 6 7 $f = 'd'; 8 9 if(is_callable($f) && function_exists($f)){ 10 11 call_user_func($f, 'Kue', 'Sub', 'Dod'); 12 13 }

:
1 a: Kue, b: Sub, c: Dod

(4) create_functionは を し、 のパラメータは のパラメータであり、2 のパラメータは の である.
1 $n = create_function('$a, $b', 'return $a + $b;');
2 
3 echo $n(1,2).'
';

:3
ここで、この で しなければならないのは、2 のパラメータ が した 、プラス を れないでください.
1 Parse error:  syntax error, unexpected '}', expecting ';' in : runtime-created function on line 1

(5)PHP 5.3 、createを するにはもっと い があります.functionの 、これがインライン の です.
1 $e = function($arg){
2 
3     echo "arg: {$arg}
"; 4 5 }; 6 7 $e('Hello world!');

これはインライン の な い です.この では、 が するにはセミコロンで する があります.
1 arg: Hello world!

(6) パッケージuse
 1 function message($m){
 2 
 3     $close = 'door';
 4 
 5     $h = function($m) use(&$close, $m){
 6 
 7         echo "{$m} close the {$close} please!
"; 8 9 $close = 'nali'; 10 11 }; 12 13 $h('Lily'); 14 15 echo $close.'
'; 16 17 } 18 19 echo call_user_func('message', 'Jim');

:
1 Jim close the door please!
2 
3 nali
  use  $close $h , $close & , $close , & ,$close 。