現在の言語: 日本語

戻る

...演算子(スプラット演算子)/引数アンパック
コールバック関数

...演算子(スプラット演算子)
PHP 5.6以降、引数名の前に ... をつけることで、
渡された複数の引数を一つの配列として受け取ることができます。
PHPの可変長引数(Variable-length argument lists)とは、
関数に任意の数の引数を渡せる仕組みです。

配列の展開(アンパック)
関数を呼び出す際に、配列の前に ... をつけると、
配列の要素を個別の引数として展開して渡せます。
$values = [10, 20, 30];
echo sum(...$values); // sum(10, 20, 30) と同じ意味になります

[サンプル]

copy
class test1
{
	function test1(array &$ary, int &$num1, int $num2):void
	{
		for($i=0; $i < $num2; $i++)
		{
			$ary[] = ++$num1;
		}
	}
}
echo "<pre>";
$cls1= new test1();

$num1 = 0;
$num2 = 3;
$ary = [];
$params = [&$ary, &$num1, $num2];
$func = $cls1->test1(...);
$func(...$params);
echo "ary count:".count($ary)." num2:$num2".PHP_EOL;//ary count:3 num2:3

echo "</pre>";
copy
class test1
{ 
	function test1(array &$ary, int &$num1, int $num2):void 
	{ 
		for($i=0; $i < $num2; $i++) 
		{ 
			$ary[] = ++$num1; 
		} 
	}
}
echo "<pre>";
$cls1= new test1();

$num1 = 0;
$num2 = 3;
$ary = [];
$params = [&$ary, &$num1, $num2];
$func = $cls1->test1(...);
$func(...$params);
echo "ary count:".count($ary)." num2:$num2".PHP_EOL;//ary count:3 num2:3

echo "</pre>";

$params = [&$ary, &$num1, $num2];
...$params(引数アンパック)を使用する場合、
配列の各要素に & を付けるかどうかで、
引数ごとに参照渡しか値渡しかを個別に制御できます。
$func(...$params);
copy
class test2
{
	function test1(int &$result, string $txt1, string $txt2, int $num1, int $num2, int $num3):string
	{
		$result =$num1 + $num2 + $num3;
		return $txt1 . $txt2;
	}
	function test2(int $num1, int $num2, int $num3, int &$result):void
	{
		$result = $num1 + $num2 + $num3;
	}
}
echo "<pre>";

$cls2 = new test2();
$ary1=[];
$ary2=[];
$ary1[]="test1:";
$ary1[]="16";
$ary2[]=10;
$ary2[]=5;
$ary2[]=1;
$result =0;
$func1 = $cls2->test1(...);
echo $func1($result, ...$ary1, ...$ary2).PHP_EOL;//test1:16
echo "result:$result".PHP_EOL;//result:16
$ary3=[];
$ary4=[];
$ary3[]=1;
$ary3[]=2;
$result =0;
$ary4[] = 3;
$ary4[] = &$result;
$func2 = $cls2->test2(...);
echo "--------------------".PHP_EOL;
$func2(...$ary3, ...$ary4).PHP_EOL;
echo "result:".$ary4[1].PHP_EOL;
echo "</pre>";
copy
class test2
{ 
	function test1(int &$result, string $txt1, string $txt2, int $num1, int $num2, int $num3):string 
	{ 
		$result =$num1 + $num2 + $num3; 
		return $txt1 . $txt2; 
	} 
	function test2(int $num1, int $num2, int $num3, int &$result):void 
	{ 
		$result = $num1 + $num2 + $num3; 
	}
}
echo "<pre>";

$cls2 = new test2();
$ary1=[];
$ary2=[];
$ary1[]="test1:";
$ary1[]="16";
$ary2[]=10;
$ary2[]=5;
$ary2[]=1;
$result =0;
$func1 = $cls2->test1(...);
echo $func1($result, ...$ary1, ...$ary2).PHP_EOL;//test1:16
echo "result:$result".PHP_EOL;//result:16
$ary3=[];
$ary4=[];
$ary3[]=1;
$ary3[]=2;
$result =0;
$ary4[] = 3;
$ary4[] = &$result;
$func2 = $cls2->test2(...);
echo "--------------------".PHP_EOL;
$func2(...$ary3, ...$ary4).PHP_EOL;
echo "result:".$ary4[1].PHP_EOL;
echo "</pre>";

test1
test1の引数で配列展開をします。$ary1:
$ary1[0]:string $txt1
$ary1[1]:string $txt2
$ary2:
$ary2[0]:int $num1
$ary2[1]:int $num2

test2
test2の引数で配列展開をします。
$ary3:
$ary3[0]:int $num1
$ary3[1]:int $num2
$ary4:
$ary4[0]:int $num3
$ary4[1]:&$result

関数を呼び出す際に配列を展開する(...$ary)場合は、
「展開した後に、通常の引数を置いてはいけない」
というルールがあります。
このため、下記のように実装して
echo $func1($result, ...$ary1, ...$ary2).
のように実行するとエラーになります。

[可変長のあとに参照渡しがある例]
function test1(string $txt1, string $txt2, int $num1, int $num2, int $num3, int &$result):string
[エラー]
Fatal error: Cannot use positional argument after argument unpacking
上記エラーを回避するには、「単独の変数($result)を、展開(...$ary)よりも前に置く」必要があります。


戻る

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