現在の言語: 日本語

戻る

無名関数(匿名関数)
コールバック関数

[コールバック関数について]
PHPのcallableとは、「関数として呼び出すことができるデータ型」を表す型ヒントです。
関数が引数として別の関数を受け取る(高階関数)際などに、
「実行可能なものだけを許可する」ために使用されています。
※PHP 5.4から使用可能

[無名関数(匿名関数):クロージャ]
その場で使い捨ての関数を定義します。
無名関数なので関数名がありません。
$func =function (int $num) use(int $tmp)
上記の無名関数があると仮定した場合
$funcは無名関数をいれる変数に過ぎません。
そのため、
$func =100;
のように変数の中身を変更することが可能です。

PHPは変数の後に()が付いていると
この変数の中身を実行しようと判断し
無名関数を実行することになります。

[引数]
値渡しおよび参照渡しが可能です。
型宣言を使用することもできます。

[useキーワード]
外部変数を取り込むことができる方法です。

値渡し
内部で変数の値を変更しても、データをコピーしたものを使用しているため

外部変数に影響しません。

参照渡し(&)
内部で変更した結果が外部変数に反映されます。
型宣言は使用できません。
(例)
$func =function (int $num) use(int $tmp)
の「use(int $tmp)」のようにint型などの型宣言は利用できません。

[サンプル]

copy
class test1
{
	function test1()
	{
		//値渡し
		$func1 =function (int $num):int
		{
			$num++;
			return $num;
		};
		echo $func1(2).PHP_EOL;//3
		$num1 = 10;
		echo $func1($num1).PHP_EOL;//11
		//参照渡しを使用したケース
		$func2 =function (int &$num):int
		{
			$num++;
			return $num;
		};
		echo $func2($num1).PHP_EOL;//11
		echo "num1:$num1".PHP_EOL;//11
		//引数が複数あるケース
		$func3 =function (int $num1, int &$num2):int
		{
			$num2++;
			$num1 += $num2;
			return $num1;
		};
		$num1 = 10;
		$num2 = 20;
		echo $func3($num1, $num2).PHP_EOL;//31
		echo "num2:$num2".PHP_EOL;//21
		//引数がないケース
		$func4 =function ()
		{
			return 100;
		};
		echo $func4().PHP_EOL;//100
	}
	function test2()
	{
		$tmp1 = 10;
		//use(外部変数)を使用するケース
		//外部変数を値渡し
		$func1 = function (int $num1, int $num2) use ($tmp1):int
		{
			return $num1 + $num2 + $tmp1;
		};
		$num1 = 1;
		$num2 = 2;
		echo $func1($num1, $num2).PHP_EOL;//13
		//use(外部変数)を参照渡しにしたケース
		//use(外部変数)には型宣言はできません
		$func2 = function (int $num1, int $num2) use (&$tmp1):int
		{
			$tmp1 *= 2;
			return $num1 + $num2 + $tmp1;
		};
		echo $func2($num1, $num2).PHP_EOL;//23
		echo "tmp1:$tmp1".PHP_EOL;//20
	}
	//voidのケース
	function test3()
	{
		$tmp1 = 10;
		//use(外部変数)を使用するケース
		//外部変数を参照渡し
		$num1 = 1;
		$num2 = 2;
		$func1 = function (int $num1, int $num2) use (&$tmp1):void
		{
			$tmp1 *= 2;
			$num1 += $num2 + $tmp1;
			return;
		};
		echo "func1:".$func1($num1, $num2).PHP_EOL;//func1:
		echo "tmp1:$tmp1".PHP_EOL;//20
	}
}
echo "<pre>";
$cls1= new test1();
$cls1->test1();
$cls1->test2();
$cls1->test3();
echo "</pre>";
copyclass test1{function test1(){// Pass by value$func1 = function (int $num):int{$num++;return $num;};echo $func1(2).PHP_EOL;//3$num1 = 10;echo $func1($num1).PHP_EOL;//11// Pass by reference$func2 = function (int &$num):int{$num++;return $num;};echo $func2($num1).PHP_EOL;//11echo "num1:$num1".PHP_EOL;//11// Multiple arguments$func3 = function (int $num1, int &$num2):int{$num2++;$num1 += $num2;return $num1;};$num1 = 10;$num2 = 20;echo $func3($num1, $num2).PHP_EOL;//31echo "num2:$num2".PHP_EOL;//21//No arguments$func4 = function (){return 100;};echo $func4().PHP_EOL;//100}function test2(){$tmp1 = 10;//Using use(external variable)//Passing external variable by value$func1 = function (int $num1, int $num2) use ($tmp1):int{return $num1 + $num2 + $tmp1;};$num1 = 1;$num2 = 2;echo $func1($num1, $num2).PHP_EOL;//13//Using use(external variable) by reference//Type declarations are not allowed for use(external variable)$func2 = function (int $num1, int $num2) use (&$tmp1):int{$tmp1 *= 2;return $num1 + $num2 + $tmp1;};echo $func2($num1, $num2).PHP_EOL;//23echo "tmp1:$tmp1".PHP_EOL;//20}/void casefunction test3(){$tmp1 = 10;/use(external variable) case/Passing external variable by reference$num1 = 1;$num2 = 2;$func1 = function (int $num1, int $num2) use (&$tmp1):void{$tmp1 *= 2;$num1 += $num2 + $tmp1;return;};echo "func1:".$func1($num1, $num2).PHP_EOL;//func1:echo "tmp1:$tmp1".PHP_EOL;//20 }}echo "<pre>";$cls1= new test1();$cls1->test1();$cls1->test2();$cls1->test3();echo "</pre>";



戻る

著作権情報
ホームページおよプリ等に掲載されている情報等については、いかなる保障もいたしません。
ホームページおよびアプリ等を通じて入手したいかなる情報も複製、販売、出版または使用させたり、
または公開したりすることはできません。
当方は、ホームページおよびアプリ等を利用したいかなる理由によっての障害等が発生しても、
その結果ホームページおよびアプリ等を利用された本人または他の第三者が被った損害について
一切の責任を負わないものとします。