Spread Operator cho biểu thức mảng sẽ xuất hiện ở PHP 7.4

PHP đã hổ trợ Argument Unpacking (AKA spread operator) từ phiên bản PHP 5.6, và PHP đã thông qua RFC này để mang tính năng này áp dụng với mảng(array) ở phiên bản PHP 7.4 với 43/44 phiếu tán thành. Cả mảng và các object implement interface Traversable có thể sử dụng được tính năng mới này.

Spread Operator là gì?

Spread Operator có syntax là dấu 3 chấm ..., cho phép chuyển đổi một mảng thành nhiều phần tử cho một array khác, tương tự như Spread Operator trong javascript.

Cách sử dụng

$parts = ['apple', 'pear'];

$fruits = ['banana', 'orange', ...$parts, 'watermelon'];

// ['banana', 'orange', 'apple', 'pear', 'watermelon'];

Có thể sử dụng nhiều lần Spread Operator trong cùng một array, không giống như argument unpacking, toán tử ... có thể sử dụng ở bất cứ vị trí nào trong array, có thể thêm các phần tử bình thường vào trước và sau Spread Operator trong array.

Spread operator có thể hoạt động với cả 2 cú pháp của array: array() và cú pháp rút gọn []

Có thể sử dụng Spread operator với cả array là kết quả được trả về từ một function.

Một số ví dụ về cách sử dụng:

$arr1 = [1, 2, 3];
$arr2 = [...$arr1]; //[1, 2, 3]
$arr3 = [0, ...$arr1]; //[0, 1, 2, 3]
$arr4 = array(...$arr1, ...$arr2, 111); //[1, 2, 3, 1, 2, 3, 111]
$arr5 = [...$arr1, ...$arr1]; //[1, 2, 3, 1, 2, 3]
 
function getArr() {
  return ['a', 'b'];
}

$arr6 = [...getArr(), 'c']; //['a', 'b', 'c']
 
$arr7 = [...new ArrayIterator(['a', 'b', 'c'])]; //['a', 'b', 'c']
 
function arrGen() {
	for($i = 11; $i < 15; $i++) {
		yield $i;
	}
}

$arr8 = [...arrGen()]; //[11, 12, 13, 14]

String keys

Array có key là string không được hổ trợ, đây là giải thích của tác giả trong RFC:

In order to make the behavior consistent with argument unpacking, string keys are not supported. A recoverable error will be thrown once a string key is encountered.

Reference

Sử dụng Spread operator với reference là không được phép:

$arr1 = [1, 2, 3];

$arr2 = [...&$arr1]; //invalid syntax

Tuy nhiên nếu sử dụng Spread operator với một array có chứa reference thì kết qủa cũng sẽ chứa reference đó:

$one = 1;

$arr1 = [&$one, 2, 3];

$arr2 = [0, ...$arr1];

var_dump($arr2);

/*
array(4) {
  [0]=>
  int(0)
  [1]=>
  &int(1)
  [2]=>
  int(2)
  [3]=>
  int(3)
}
*/

Bạn có thể xem rõ hơn tại: Spread Operator in Array Expression 👍