PHP 8.1의 새로운 기능

4028 단어
PHP 8.1은 현재 활발히 개발 중이며 아마도 2021년 11월 말쯤에 출시될 것입니다. 우리는 이미 일부 기능, 변경 사항 및 사용 중단을 알고 있으므로 하나씩 살펴보겠습니다.

PHP 8.1의 개발에 대한 최신 정보를 원하십니까? 내 뉴스레터를 구독하고 비정기적인 업데이트를 받으십시오.

새로운 기능



모든 릴리스와 마찬가지로 PHP 8.1에는 몇 가지 멋진 새 기능이 추가되었습니다. 이 목록은 매년 증가할 것임을 명심하십시오. 나는 또한 아직 구현되지 않았지만 언어로 끝날 좋은 기회를 만드는 기능을 나열하고 있습니다. 나는 항상 그 기능을 표시하도록 할 것입니다.

문자열 키로 배열 풀기



배열 풀기는 이미 에서 허용되었지만 숫자 키에서만 작동했습니다. 문자열 키가 이전에 지원되지 않았던 이유는 배열 중복을 병합하는 방법에 대한 합의가 없었기 때문입니다. RFC는 array_merge의 의미를 따르면서 이를 깔끔하게 해결합니다.

$array1 = ["a" => 1];

$array2 = ["b" => 2];

$array = ["a" => 0, ...$array1, ...$array2];

var_dump($array); // ["a" => 1, "b" => 2]


새로운 array_is_list 함수



아마도 한 번쯤 이 문제를 해결해야 했을 것입니다. 배열의 키가 인덱스 0부터 시작하여 숫자 순서인지 확인합니다. 마치 json_encode가 배열을 배열로 인코딩할지 아니면 객체로 인코딩할지 결정하는 것과 같습니다.

PHP 8.1은 배열이 이러한 의미 체계를 가진 목록인지 여부를 결정하는 내장 함수를 추가합니다.

$list = ["a", "b", "c"];

array_is_list($list); // true

$notAList = [1 => "a", 2 => "b", 3 => "c"];

array_is_list($notAList); // false

$alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"];

array_is_list($alsoNotAList); // false


명시적 8진수 정수 리터럴 표기법



이제 0o0O를 사용하여 8진수를 나타낼 수 있습니다. 숫자 앞에 0를 붙인 이전 표기법도 여전히 작동합니다.

016 === 0o16; // true
016 === 0O16; // true


열거



이 RFC는 아직 논의 중입니다.

아직 투표가 없었지만 열거형을 추가하자는 이 제안은 열광적으로 받아들여졌습니다. 그들이 추가하는 가치에 대해 확신이 없으면 그에 대해 읽을 수 있습니다.

열거형을 추가하는 것은 PHP에서 상당한 개선이 될 것이므로 저는 이 RFC가 더 발전하는 것을 매우 기대하고 있습니다. 어떻게 생겼는지에 대한 빠른 미리보기를 제공하기 위해 다음은 코드 샘플입니다.

enum Status {
  case Pending;
  case Active;
  case Archived;
}


그리고 이것이 그들이 사용되는 방법입니다:

class Post
{
    public function __construct(
        private Status $status = Status::Pending;
    ) {}

    public function setStatus(Status $status): void
    {
        // …
    }
}

$post->setStatus(Status::Active);


주요 변경 사항



PHP 8.1은 마이너 버전이지만 기술적으로 주요 변경 사항이 될 수 있는 몇 가지 변경 사항과 사용 중단이 있을 것입니다. 하나씩 논의해 보겠습니다.

$GLOBALS 사용 제한


$GLOBALS 사용 방법에 대한 약간의 변경은 모든 어레이 작업의 성능에 상당한 영향을 미칩니다. Nikita는 RFC에서 문제와 솔루션을 잘 설명하고 있습니다. 변경 사항은 일부 극단적인 경우가 $GLOBALS 로 더 이상 수행할 수 없음을 의미합니다. "더 이상 지원되지 않는 것은 전체적으로 $GLOBALS에 대한 쓰기입니다. 다음 모두는 컴파일 시간 오류를 생성합니다.":

$GLOBALS = [];
$GLOBALS += [];
$GLOBALS =& $x;
$x =& $GLOBALS;
unset($GLOBALS);


게다가 참조로 전달$GLOBALS하면 런타임 오류가 생성됩니다.

by_ref($GLOBALS); // Run-time error


Nikita는 packageist에서 상위 2000개의 패키지를 분석한 결과 이 ​​변경 사항의 영향을 받는 23개의 케이스만 찾았습니다. 우리는 이것이 기술적으로 파괴적인 변화의 영향이 낮을 것이라는 결론을 내릴 수 있습니다. 이것이 내부가 PHP 8.1에 이를 추가하기로 결정한 이유입니다. 코드의 모든 부분에 긍정적인 성능 영향을 주는 이 변경으로 우리 대부분이 승리할 것임을 기억하십시오.

내부 함수의 null을 허용하지 않는 인수에 null 전달 사용 중단



이 변경은 간단합니다. 내부 함수는 현재 null을 허용하지 않는 인수에 대해 허용null하고 이 RFC는 해당 동작을 더 이상 사용하지 않습니다. 예를 들어 현재 다음과 같이 가능합니다.

str_contains("string", null);


PHP 8.1에서 이러한 종류의 오류는 사용 중단 경고를 표시하고 PHP 9에서는 유형 오류로 변환됩니다.


지금은 여기까지입니다. 한 해 동안 이 게시물을 정기적으로 업데이트할 것이므로 루프에 유지하려면 subscribe을 확인하십시오. PHP 8.1을 종료했습니까? 에 알려주세요!

좋은 웹페이지 즐겨찾기