読者です 読者をやめる 読者になる 読者になる

woshidan's blog

そんなことよりコードにダイブ。

コールバック関数/可変関数/無名関数について

php

phpの関数について勉強したもののまとめその2.

抽象的なものはそこまで複雑な操作が必要なものをまだ作らない気がしてなかなか気が進みませんね……。

 

とりあえず、今回は、

  • コールバック関数
  • 可変関数
  • 無名関数

について。

 

コールバック関数

 phpには引数を関数に指定すると特定の処理にその関数を呼び出すような関数があります。つまり、ある関数は引数に関数を指定すると、その関数を決まった方法で使うようにできるものがある、ということ。

 もう少し言うと、関数Aと配列を引数にとる関数Bがあって、

 関数Bは引数の配列の要素に対して関数Aを一回ずつ適用していくよ、みたいな

 特別な関数(この場合、関数Bはarray_map()関数なんだけど)がいくつかあって、

 こういう特別な関数の、引数の関数Aのほうをコールバック関数といいます。

 コールバック関数には、

  •  関数名を表す文字列
  •  無名関数
  •  クラスやクラスのインスタンスとメソッド名を持つ配列
  •  クラスの静的メソッドを表す文字列

 があります。

 

可変関数

 文字列変数に関数の名前を代入して、その文字列変数の後ろに()をつけることで、

 代入された関数を呼び出すことが出来ます。

 たとえば、

<?php
function func(){
echo "func呼び出し";
}
$name = 'func';
$name();
?>

 を実行するとブラウザ上で

 func呼び出し

 と出力されます。

 

 

 便利そうだけど実際使うには自分にはまだまだややこしいかも。

 

 

  

無名関数

JavaScript

window.onload = function(){
}

という使われ方が、いま自分としては一番よく思い浮かぶような気がします。

その場でしか呼び出さないような一連の処理を、名前をつけずに関数としてまとめられます、というものなのでしょうか。

関数を変数のように扱うことも出来ます。

この場合、無名関数を入れるほうはオブジェクトなのでしょうか。

 

たとえば、

<?php
$func = function($v1, $v2){
return $v1 + $v2;
};
 
echo $func(1,2); // 3
echo '<br>
 
$func = function($v1, $v2){
return $v1 - $v2;
};
 
echo $func(1,2); // -1
 
?>

とすると、

3 
-1

と表示されて、代入する数値は同じなのにfunc()の結果が変わっていることが確認できます。

関数が入っているfuncというオブジェクトの中身が変数の中身を変更するような感じで変更することが可能です。

 

これを利用するとコールバック関数を条件によって変えたいと思ったとき、

呼び出すかもしれない関数をすべてグローバルで定義するのではなくて、

関数が入った変数のほうを条件によって変えればいいことになるので、少し楽かもしれません。

 

クロージャはまだちょっと使いどころが分からない気がしたので、後日にして、

とりあえず、また作っていたものの続き書きたいやも。