PHP 三個點運算子(可變參數) Variadic Function

官方文件:

https://www.php.net/manual/en/migration56.new-features.php

  • 可支援版本 php 5.6 以上

緣由

只有在 function 內才看過這個運算子,第一次聽到同事說可以用在 function 以外的地方,覺得很神奇。

function 內使用像是濃縮(packing)在一起,在外面就是一個 foreach 釋放(unpacking)所有的值。

使用在function 中

1
2
3
4
5
6
7
8
9
10
function add(int ... $nums) {
$total = 0;
foreach ($nums as $num) {
$total += $num;
}

return $total;
}

echo add(1, 2, 3, 4, 5); // 15

使用在function 外

情境是:有客服的多組Email,再寄信給乘客時要連同客服的Email一起寄出。
一般解法需要把多組Email的字串拆解成 array, 再將單一字串的Email加入到 array 中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$serviceMails = 'test1@example.com,test2@example.com';
$memberMail = 'member@examle.com';

// plan A
$mails = [...explode(',' , $serviceMails), $memberMail];

// plan B
$mails = array_merge(explode(',' , $serviceMails), [$memberMail]);

// plan C
$mails = explode(',' , $serviceMails);
$mails[] = $memberMail;

// plan D
$mails = explode(',' , $serviceMails);
array_push($mails, $memberMail);

print_r($mails);
/*
Array
(
[0] => test1@example.com
[1] => test2@example.com
[2] => member@examle.com
)
*/

小實驗

  • 是否可以宣告型別 intstring

    可以

1
2
3
4
5
6
function test(array ...$data) {
print_r($data);
}

test(1, 2, 3); // 500 Error
test((array)'1', [2, 3]); // OK