現在の言語: 日本語

戻る

PHPの可変長引数
引数

...演算子(スプラット演算子)による定義
PHP 5.6以降、引数名の前に ... をつけることで、渡された複数の引数を一つの配列として受け取ることができます。

通常の引数との併用
通常の引数の後に可変長引数を置くことができます。可変長引数は必ず最後に定義する必要があります。

型指定(Type Hinting)
可変長引数にも型を指定できます。この場合、渡される全ての値がその型である必要があります。

配列の展開(アンパック)
関数を呼び出す際に、配列の前に ... をつけると、配列の要素を個別の引数として展開して渡せます。

[サンプル]

copy
class test1
{
	function test1(...$data):int
	{
		$total = 0;
		for($i=0; $i < count($data); $i++) $total += $data[$i];
		return $total;
	}
	function test2($str, ...$data):string
	{
		foreach($data as $tmp) $str.=$tmp;
		return $str;
	}
	function test3(int ...$num):int
	{
		$total = 0;
		foreach($num as $tmp) $total += $tmp;
		return $total;
	}
	function test4(...$num):int
	{
		$total = 0;
		foreach($num as $tmp) $total += $tmp;
		return $total;
	}
}
echo "<pre>";
$cls1= new test1();
echo $cls1->test1(1,2,3).PHP_EOL;//6
$tmp = "ghijk";
echo $cls1->test2("a","bc", "def", $tmp).PHP_EOL;//abcdefghijk
echo $cls1->test3(1,2,3,4,5,6,7,8,9,10).PHP_EOL;//55
echo $cls1->test3(1,"2",3).PHP_EOL;//6
//echo $cls1->test3(1,"aaa",3).PHP_EOL;//Fatal error:  Uncaught TypeError: test1::test4(): Argument #2 must be of type int, string given
$ary=[];
for($i=0; $i < 10; $i++)
{
	$ary[] =$i+1;
	}
var_dump($ary);
/*
array(10) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
  [4]=>
  int(5)
  [5]=>
  int(6)
  [6]=>
  int(7)
  [7]=>
  int(8)
  [8]=>
  int(9)
  [9]=>
  int(10)
}
*/
echo $cls1->test4(...$ary).PHP_EOL;//55
echo "</pre>";
copy
class test1
{ 
function test1(...$data):int 
{ 
$total = 0; 
for($i=0; $i < count($data); $i++) $total += $data[$i]; 
return $total; 
} 
function test2($str, ...$data):string 
{ 
foreach($data as $tmp) $str.=$tmp; 
return $str; 
} 
function test3(int ...$num):int 
{ 
$total = 0; 
foreach($num as $tmp) $total += $tmp; 
return $total; 
} 
function test4(...$num):int 
{ 
$total = 0; 
foreach($num as $tmp) $total += $tmp; 
return $total; 
}
}
echo "<pre>";
$cls1= new test1();
echo $cls1->test1(1,2,3).PHP_EOL;//6
$tmp = "ghijk";
echo $cls1->test2("a","bc", "def", $tmp).PHP_EOL;//abcdefghijk
echo $cls1->test3(1,2,3,4,5,6,7,8,9,10).PHP_EOL;//55
echo $cls1->test3(1,"2",3).PHP_EOL;//6
//echo $cls1->test3(1,"aaa",3).PHP_EOL;//Fatal error: Uncaught TypeError: test1::test4(): Argument #2 must be of type int, string given
$ary=[];
for($i=0; $i < 10; $i++)
{ 
$ary[] =$i+1; }
var_dump($ary);
/*
array(10) { 
[0]=> 
int(1) 
[1]=> 
int(2) 
[2]=> 
int(3) 
[3]=> 
int(4) 
[4]=> 
int(5) 
[5]=> 
int(6) 
[6]=> 
int(7) 
[7]=> 
int(8) 
[8]=> 
int(9) 
[9]=> 
int(10)
}
*/
echo $cls1->test4(...$ary).PHP_EOL;//55
echo "</pre>";

function test1(...$data):int
引数名の前に ... をつけることで、渡された複数の引数を一つの配列として受け取ることができます。

test3(int ...$num): $num の各要素が int であることを強制します

test4
PHPは動的型付け言語なので、型宣言がない場合は渡された値の型(int, array, stringなど)がそのまま維持されます。

[エラーとなる例]
echo $cls1->test4($ary);

[内部エラー]
Warning: Array to string conversion
引数は「$ary という配列が1個」だと解釈され
関数の引数である$numは[$ary]配列の中に配列が入った二次元配列のような状態になります。
$num[0] には配列($ary)が入っています。
PHPでは echo で配列を表示しようとすると
Array to string conversion 警告が発生し、
中身ではなく文字列 "Array" として出力しようとします。
そのため、関数を呼び出す際にも ... を使って配列を展開(アンパック)して渡す必要があります。
(例)
echo $cls1->test4(...$ary);


戻る

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