現在の言語: 日本語

戻る

アロー関数
コールバック関数

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

[アロー関数]
PHP 7.4で導入された匿名関数(クロージャ)をより短く書くための構文です。
fn(int $x): int => $x * 2;
fn(int $x): int (関数の定義部分)
fn: アロー関数であることを示すキーワードです。
(int $x): 引数の定義です。
: int: 戻り値の型指定です。
=> (矢印記号)
左側の引数を使って、右側の式を評価して返すという、定義と処理をつなぐ区切り記号です。
$x * 2 (関数の処理内容 兼 戻り値)
ここが処理の中身です。
アロー関数の最大の特徴は、この式の評価結果がそのまま return されるという点です。
fnで定義し、=>の右側にある処理の結果を自動的に返す、簡潔な匿名関数です。

[サンプル]

copy
class test1
{
	//ノーマルの使い方
	function test1()
	{
		$int = fn(int $num) : int => $num * 2;
		//変数に値を設定して実行するケース
		echo $int(5).PHP_EOL;//10
		$tmp = 2;
		//引数に変数を使用して実行するケース
		echo $int($tmp).PHP_EOL;//4
		$tax = 0.1;
		$tmp =500;
		$int2 = fn(int $num) : int => $num * (1 + $tax);
		//外部変数を使用するケース
		echo $int2($tmp).PHP_EOL;//550
	}
	//引数に参照結果を使用するけーす
	function test2()
	{
		$int1 = fn(int &$num):int => ++$num + 1;
		$tmp = 1;
		echo $int1($tmp).PHP_EOL;//3
		echo "tmp:$tmp".PHP_EOL;//2
		$tmp = 10;
		$int2 = fn(int &$num):int => $num++ + 1;
		echo $int2($tmp).PHP_EOL;//11
		echo "tmp:$tmp".PHP_EOL;//11
	}
	function test3()
	{
		$log = fn(string $msg) => print($msg);
		$tmp = "log in test3 execute.";
		$log($tmp).PHP_EOL;//log in test3 execute.
	}
	function test4()
	{
		$int = fn(array $ary):int => $this->add((int)$ary[0], (int)$ary[1]) * $this->minus((int)$ary[2], (int)$ary[3]);
		$tmp = [];
		$tmp[] = 1;
		$tmp[] = 2;
		$tmp[] = 10;
		$tmp[] = 5;
		echo $int($tmp).PHP_EOL;//15
	}
	private function add(int $num1, int $num2):int
	{
		return $num1 + $num2;
	}
	private function minus(int $num1, int $num2):int
	{
		return $num1 - $num2;
	}
}
echo "<pre>";
$cls1= new test1();
$cls1->test1();
$cls1->test2();
$cls1->test3();
$cls1->test4();
echo "</pre>";
copy
class test1
{
	//Normal usage
	function test1()
	{
		$int = fn(int $num) : int => $num * 2;
		//Execution with a variable value set
		echo $int(5).PHP_EOL;//10
		$tmp = 2;
		//Execution with a variable argument
		echo $int($tmp).PHP_EOL;//4
		$tax = 0.1;
		$tmp =500;
		$int2 = fn(int $num) : int => $num * (1 + $tax);
		//Execution with an external variable
		echo $int2($tmp).PHP_EOL;//550
	}
	//Execution with a reference result argument
	function test2()
	{
		$int1 = fn(int &$num):int => ++$num + 1;
		$tmp = 1;
		echo $int1($tmp).PHP_EOL;//3
		echo "tmp:$tmp".PHP_EOL;//2 
		$tmp = 10; 
		$int2 = fn(int &$num):int => $num++ + 1; 
		echo $int2($tmp).PHP_EOL;//11 
		echo "tmp:$tmp".PHP_EOL;//11 
	} 
	function test3() 
	{ 
		$log = fn(string $msg) => print($msg); 
		$tmp = "log in test3 execute."; 
		$log($tmp).PHP_EOL;//log in test3 execute. 
	} 
	function test4() 
	{ 
		$int = fn(array $ary):int => $this->add((int)$ary[0], (int)$ary[1]) * $this->minus((int)$ary[2], (int)$ary[3]); 
		$tmp = []; 
		$tmp[] = 1; $tmp[] = 2; 
		$tmp[] = 10; 
		$tmp[] = 5; 
		echo $int($tmp).PHP_EOL;//15 
	} 
	private function add(int $num1, int $num2):int 
	{ 
		return $num1 + $num2; 
	} 
	private function minus(int $num1, int $num2):int 
	{ 
		return $num1 - $num2; 
	}
}
echo "<pre>";
$cls1= new test1();
$cls1->test1();
$cls1->test2();
$cls1->test3();
$cls1->test4();
echo "</pre>";

test1
$int(5);
引数に5を入れて$intを実行します。
アロー関数を定義した$int変数を()とすることで関数として実行しています。
$int = fn(int $num) : int => $num * 2;
fn(int $num)
$numには引数としての5が入ります。
$num * 2;
$num(5) * 2 = 10
これが戻り値となります。
:int
がint型としての返り値として評価結果を返します。

$int2($tmp);
$tmp(500)を引数の値として$int2変数を実行しています。
$int2 = fn(int $num) : int => $num * (1 + $tax);
fn(int $num)
$numには$tmpの500が入ります。
$num * (1 + $tax)
$num(500) * (1 + $tax(0.1))
$taxは外部変数を使用できるので0.1の値を参照します。
500 * (1 + 0.1) = 500 * (1.1) =550
この計算結果を:intの返り値として評価結果を返します。

test2
$int1($tmp)
$tmp(1)を引数の値として$int1変数を実行しています。
$int1 = fn(int &$num):int => ++$num + 1;
fn(int &$num)
$num引数に$tmp(1)が入ります。
&$numなので参照渡しとなります。
++$num + 1;
++$numなので$numをインクリメントした結果を使います。
++$num(2) +1 = 2 + 1 = 3
:int
がint型としての返り値として評価結果を返します。
引数は参照渡しであるため$numがインクリメントされた結果が反映されます

$int2($tmp)
$tmp(10)を引数の値として$int2変数を実行しています。
$int2 = fn(int &$num):int => $num++ + 1;
fn(int &$num)
$num引数に$tmp(10)が入ります。
&$numなので参照渡しとなります。
$num++ + 1;
$num++なので、このステップが実行されたあとでないと$numがインクリメントされません。
そのため
$num++ + 1 = 1 + 1 =2
:int
がint型としての返り値として評価結果を返します。
引数は参照渡しであるため$numがインクリメントされた結果が反映されます

test3
PHPのアロー関数で戻り値の型として void を指定することはできません。
fn(string $msg):void
として実行すると下記のようにエラーが発生します。
Fatal error: A void function must not return a value

$log = fn(string $msg) => print($msg);
voidにするとエラーになりますが、型を指定しなければ、実行可能となります。(内部的には null が返されます)。
戻り値は print の結果(通常 1)になるが、無視して実行できます。
そのため、戻り値を指定せずに実行することで「値を返すこと」が目的ではないvoidのように実行できます。

test4
$int($tmp)
$intの引数に配列を渡します。
$int = fn(array $ary):int => $this->add((int)$ary[0], (int)$ary[1]) * $this->minus((int)$ary[2], (int)$ary[3]);
fn(array $ary)
$tmp配列を受け取ります。
$this->add((int)$ary[0], (int)$ary[1]) * $this->minus((int)$ary[2], (int)$ary[3]);
アロー関数は複数行に渡った実行ができないため
三項演算子を使ったり、
関数などを使うことで、複数行の代行ができます。
$this->add((int)$ary[0], (int)$ary[1])
1 + 2 =3
$this->minus((int)$ary[2], (int)$ary[3])
10 - 5 = 5
3 * 5 =15
:int
がint型としての返り値として評価結果を返します。


戻る

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