PHP 7.4는 PHP 7의 다음 마이너 버전이며 2019년 11월 28일에 정식 출시될 예정입니다. PHP를 더욱 빠르고 안정적으로 만들어 줄 PHP 7.4의 새로운 기능을 살펴보겠습니다.
물론 PHP 8이 더욱 기대됩니다. JIT 의 일부 제안이 승인되었으므로 이는 PHP의 또 다른 이정표가 될 수 있습니다.
PHP 7.4를 사용하는 PHP의 새로운 기능은 무엇인가요?
● 배열 내 압축 풀기 지원 - 배열 확산 연산자
● 화살표 함수 2.0(더 짧은 클로저)
PHP 7.4에서는 배열 표현식에 Spread 연산자가 도입되었습니다.
PHP 5.6부터 사용 가능합니다. 매개변수 풀기는 다음을 위한 구문입니다. 배열과 Traversables 을 매개변수 목록으로 풀어냅니다. 배열 또는 Traversable의 압축을 풀려면 다음 예와 같이 ...(점 3개) 접두사가 붙어야 합니다.
function test(...$args) { var_dump($args); } test(1, 2, 3);
그러나 PHP 7.4 RFC에서는 이 기능을 배열로 확장하여 정의할 것을 권장합니다.
$arr = [...$args];
Spread 연산자 첫 번째 이점은 성능입니다. RPC 문서에는 :
Spread 연산자가 array_merge보다 더 나은 성능을 가져야 한다고 명시되어 있습니다. 스프레드 연산자가 구문 구조이고 array_merge가 메소드라는 것만이 아닙니다. 또한 컴파일 타임에 상수 배열은 높은 효율성을 위해 최적화됩니다.
Spread 연산자의 중요한 장점은 탐색 가능한 모든 개체를 지원하는 반면 array_merge 함수는 배열만 지원한다는 것입니다.
다음은 Spread 연산자를 사용하는 배열의 매개변수 예입니다.
$parts = ['apple', 'pear']; $fruits = ['banana', 'orange', ...$parts, 'watermelon']; var_dump($fruits);
PHP 7.3 이하에서 이 코드를 실행하면 PHP는 구문 분석 오류를 발생시킵니다.
Parse error: syntax error, unexpected '...' (T_ELLIPSIS), expecting ']' in /app/spread-operator.php on line 3
반면, PHP 7.4는 배열을 반환합니다.
array(5) { [0]=> string(6) "banana" [1]=> string(6) "orange" [2]=> string(5) "apple" [3]=> string(4) "pear" [4]=> string(10) "watermelon" }
RFC에서는 동일한 배열을 여러 번 확장할 수 있다고 명시합니다. 또한 스프레드 연산자 앞이나 뒤에 일반 요소를 추가할 수 있으므로 배열의 어느 곳에서나 스프레드 연산자 구문을 사용할 수 있습니다. 따라서 다음 코드는 예상대로 작동합니다.
$arr1 = [1, 2, 3]; $arr2 = [4, 5, 6]; $arr3 = [...$arr1, ...$arr2]; $arr4 = [...$arr1, ...$arr3, 7, 8, 9];
함수에서 반환된 배열을 매개변수로 가져와 새 배열에 넣을 수도 있습니다.
function buildArray(){ return ['red', 'green', 'blue']; } $arr1 = [...buildArray(), 'pink', 'violet', 'yellow'];
PHP 7.4는 다음 배열을 출력합니다.
array(6) { [0]=> string(3) "red" [1]=> string(5) "green" [2]=> string(4) "blue" [3]=> string(4) "pink" [4]=> string(6) "violet" [5]=> string(6) "yellow" }
generator를 사용할 수도 있습니다:
function generator() { for ($i = 3; $i <= 5; $i++) { yield $i; } } $arr1 = [0, 1, 2, ...generator()];
그러나 참조로 전달하는 것은 허용되지 않습니다. 다음 예를 고려하십시오.
$arr1 = ['red', 'green', 'blue']; $arr2 = [...&$arr1];
참조로 전달하려고 하면 PHP는 다음과 같은 구문 분석 오류를 발생시킵니다.
Parse error: syntax error, unexpected '&' in /app/spread-operator.php on line 3
첫 번째 배열의 요소가 참조로 저장되면 두 번째 배열에도 참조로 저장됩니다. 배열로. 예는 다음과 같습니다.
$arr0 = 'red'; $arr1 = [&$arr0, 'green', 'blue']; $arr2 = ['white', ...$arr1, 'black'];
이것은 PHP 7.4에서 얻을 수 있는 것입니다:
array(5) { [0]=> string(5) "white" [1]=> &string(3) "red" [2]=> string(5) "green" [3]=> string(4) "blue" [4]=> string(5) "black" }
Arrow Functions 2.0 (Short Closures)
PHP에서 익명 함수는 매우 장황하고 구현 및 유지 관리가 어려운 것으로 간주됩니다. RFC 에서는 코드를 간결하게 작성할 수 있도록 더 간단하고 명확한 화살표 함수(또는 짧은 클로저) 구문을 도입할 것을 제안합니다.
PHP 7.4 이전:
function cube($n){ return ($n * $n * $n); } $a = [1, 2, 3, 4, 5]; $b = array_map('cube', $a); print_r($b);
PHP 7.4에서는 더 간결한 구문을 허용하므로 위 함수를 다음과 같이 다시 작성할 수 있습니다.
$a = [1, 2, 3, 4, 5]; $b = array_map(fn($n) => $n * $n * $n, $a); print_r($b);
현재 언어 구조로 인해 익명 함수(클로저)가 상위 함수를 상속할 수 있습니다. 다음과 같이 범위에 정의된 사용 변수를 사용합니다:
$factor = 10; $calc = function($num) use($factor){ return $num * $factor; };
그러나 PHP 7.4에서는 상위 범위의 값이 암시적으로 캡처됩니다(값의 범위에 의해 암시적으로 바인딩됨). 따라서 이 기능을 한 줄로 완료할 수 있습니다.
$factor = 10; $calc = fn($num) => $num * $factor;
부모 범위에 정의된 변수는 화살표 기능에 사용될 수 있습니다. 이는 use의 사용과 동일하며 부모가 수정할 수 없습니다.
새로운 구문을 사용하면 더 읽기 쉽고 유지 관리하기 쉬운 코드를 작성할 수 있으므로 언어가 크게 향상되었습니다.
NULL 병합 연산자
일상적으로 삼항 표현식과 isset()을 동시에 사용하는 상황이 많기 때문에 null 병합 연산자(??)의 구문 설탕을 추가했습니다. 변수가 존재하고 NULL이 아니면 자체 값을 반환하고, 그렇지 않으면 두 번째 피연산자를 반환합니다.
$username = $_GET['user'] ?? ‘nobody';
이 코드의 기능은 매우 간단합니다. 요청 매개변수를 가져오고 해당 매개변수가 없으면 기본값을 설정합니다. 하지만 이 RFC 예에서 변수 이름이 더 길면 어떻게 될까요?
$this->request->data['comments']['user_id'] = $this->request->data['comments']['user_id'] ?? 'value';
长远来看,这段代码可能难以维护。因此,旨在帮助开发人员编写更直观的代码,这个 RFC 建议引入 null 合并等于运算符 (null_coalesce_equal_operator)??=,所以我们可以敲下面这段代码来替代上面的这段代码:
$this->request->data['comments']['user_id'] ??= ‘value’;
如果左侧参数的值为 null,则使用右侧参数的值。
注意,虽然 coalesce 运算符 ?? 是一个比较运算符,但 ??= 它是赋值运算符。