現在の言語: 日本語

戻る

メソッドを部品(関数オブジェクト)としてコールバック関数
コールバック関数

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

メソッドを部品(関数オブジェクト)としてコールバック関数を実行
「部品」化したメソッド変数は、メソッドを部品(Callableオブジェクト)として切り出して、
コールバックとして利用できるようになります。

[サンプル]

copy
class test1
{
	function test1():void
	{
		echo "test1 execute".PHP_EOL;
	}
	function test2(int $num1, int $num2):int
	{
		return $num1 + $num2;
	}
	function test3(int &$result, array $ary):void
	{
		$result = 0;
		for($i=0; $itest1();
$num1 = 1;
$num2 = 2;
$ary = [];
for($i=0; $i<3; $i++)
{
	$ary[] = $i +1;
}
$test1 =$cls1->test1(...);
$test2 =$cls1->test2(...);
$test3 =$cls1->test3(...);
$result = 0;
$test1();
/*
test1 execute
test1 execute
*/
echo $test2($num1, $num2) . PHP_EOL;//3
// 参照渡しも維持されます
$test3($result, $ary); 
echo "result:$result".PHP_EOL;//result:6
echo "</pre>";
copy
class test1
{ 
	function test1():void 
	{ 
		echo "test1 execute".PHP_EOL; 
	} 
	function test2(int $num1, int $num2):int 
	{ 
		return $num1 + $num2; 
	} 
	function test3(int &$result, array $ary):void 
	{ 
		$result = 0; 
		for($i=0; $itest1();
$num1 = 1;
$num2 = 2;
$ary = [];
for($i=0; $i<3; $i++)
{ 
	$ary[] = $i +1;
}
$test1 =$cls1->test1(...);
$test2 =$cls1->test2(...);
$test3 =$cls1->test3(...);
$result = 0;
$test1();
/*
test1 execute
test1 execute
*/
echo $test2($num1, $num2) . PHP_EOL;//3
// Passing by reference is also maintained
$test3($result, $ary);
echo "result:$result".PHP_EOL;//result:6
echo "</pre>";

First-class Callable Syntax
メソッド名の後ろに (...) を付けます。
「...」の呼び方
PHPにおいて、この記号は文脈によって2通りの呼び方があります。
引数アンパック (Argument Unpacking)
今回のように、関数を呼び出す側で配列の前に付ける場合は「アンパック」と呼びます。
配列の中身をバラバラにして引数に展開する(荷解きする)イメージです。
可変長引数 (Variadic Functions) / スプラット演算子
関数の定義側
(例)
function test(...$args)
で使う場合は「可変長引数」や「スプラット演算子」と呼ばれます。
$test1 =$cls1->test1(...);
test1(...)とは、実行可能な関数オブジェクトとして変数に入れるということです。
(...) を使うことでメソッドを部品(関数オブジェクト)として切り出して、
好きなタイミングで実行できるようになります。
copy
class test2
{
	function test(array &$ary, int &$num):void
	{
		for($i=0;$i<10;$i++)
		{
			$ary[]=$num;
			$num++;
		}
	}
}
echo "<pre>";

$cls2 = new test2();
$func = $cls2->test(...);
$num = 1;
$ary= [];
$func($ary, $num);
echo "ary count:".count($ary)." num:$num".PHP_EOL;//ary count:10 num:11
echo "</pre>";
copy
class test2
{
	function test(array &$ary, int &$num):void
	{
		for($i=0;$i<10;$i++)
		{
			$ary[]=$num;
			$num++;
		}
	}
}
echo "<pre>";

$cls2 = new test2();
$func = $cls2->test(...);
$num = 1;
$ary= [];
$func($ary, $num);
echo "ary count:".count($ary)." num:$num".PHP_EOL;//ary count:10 num:11
echo "</pre>";
参照渡しのサンプルとなります。
実行元の関数の引数が参照渡しになっている場合、参照渡しが可能となります。
$func = $cls2->test(...);
... (First-class callable syntax)により
クラス内部から自身のメソッドを実行する準備をします。
$func変数に()をつけることで実行できますが、
この例では配列とint型変数を設定し実行しています。

$cls2->test(...) によって、testメソッドを指すClosure オブジェクトが生成されます。
このとき、メソッド定義にある
&$ary(参照渡し)
&$num(参照渡し)
の性質も引き継がれます。
$func($ary, $num)を実行すると、変数$aryおよび$numそのものがメソッドに渡されます。
メソッド内での変更が呼び出し元の$aryおよび$numに反映されます。

戻る

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