> 백엔드 개발 > PHP8 > 본문

PHP8.1 새로운 기능 설명 초기화 초기화

藏色散人
풀어 주다: 2023-02-17 12:14:02
원래의
2814명이 탐색했습니다.

이 기사는 번역되었습니다. 원본 주소: https://stitcher.io/blog/php-81-new-in-initializers

PHP 8.1: 초기화 프로그램(초기화 프로그램의 새로운 기능)

PHP 8.1에 하나가 추가되었습니다. 작은 디테일처럼 보일 수도 있지만, 많은 사람들에게 일상적으로 큰 영향을 미칠 것이라고 생각합니다. 그러면 "이니셜라이저 RFC의 새로운 기능"은 무엇에 관한 것인가요? 예를 살펴보겠습니다. 우리는 모두 다음과 같은 코드를 작성했습니다.

class MyStateMachine
{
    public function __construct(
        private ?State $state = null,
    ) {
        $this->state ??= new InitialState();
    }
}
로그인 후 복사

이 상태 머신 예에서는 초기 상태가 있거나 없는 두 가지 방법으로 클래스를 구성하려고 합니다. 초기 상태 없이 빌드하는 경우 기본 상태를 설정하려고 합니다. PHP는 확실히 매개변수 목록에서 직접 초기값 설정을 지원하지만 기본 유형에 대해서만 지원합니다. 예를 들어, 상태 머신이 객체 대신 내부적으로 문자열을 사용하는 경우 생성자를 다음과 같이 작성할 수 있습니다.

class MyStateMachine
{
    public function __construct(
        private string $state = 'initial',
    ) {
    }
}
로그인 후 복사

따라서 PHP 8.1에서는 객체에 대해 동일한 "기본값" 구문을 사용할 수도 있습니다. 즉, 새로운 기본 매개변수를 사용할 수 있습니다(이것은 "초기화 프로그램"의 예입니다):

class MyStateMachine
{
    public function __construct(
        private State $state = new InitialState(),
    ) {
    }
}
로그인 후 복사

"초기화 프로그램"은 단순한 매개변수 기본값 그 이상입니다. 다음은 RFC의 간단한 설명입니다.

RFC가 새로운 표현식을 제안합니다 매개변수 기본값, 속성 매개변수, 정적 변수 이니셜라이저 및 전역 상수 이니셜라이저에서 허용됩니다.

그 말이 맞습니다. 속성도 이 목록에 있습니다! 속성을 사용하여 속성에 대한 입력의 유효성을 검사하는 간단한 유효성 검사 라이브러리를 상상해 보세요. 아마도 다음과 같이 배열 요소의 유효성을 검사할 수 있어야 할 것입니다:

class CreateEmailsRequest extends FormRequestData
{
    #[ValidArray(
        email: [new Required, new ValidEmail],
        name: [new Required, new ValidString],
    )]
    public array $people;
}
로그인 후 복사

PHP 8.1 이전에는 평가 방식으로 인해 속성에서 new를 사용할 수 없었기 때문에 이와 같은 코드를 작성할 수 없었습니다. 당신은 할 수 있습니다!

언급할 가치가 있는 몇 가지 중요한 세부 사항을 살펴보겠습니다.

PHP 8.1에 대해 더 알고 싶으십니까? PHP 8.1에 대한 경로가 있습니다. 앞으로 10일 동안 PHP 8.1의 새로운 기능과 기존 기능에 대한 이메일을 매일 받게 됩니다. 그러면 자동으로 구독이 취소되므로 스팸이나 후속 이메일을 받지 않게 됩니다. 지금 구독하세요!

#필요할 때만 구축

이 "새로운 가치"는 실제로 필요할 때만 구축됩니다. 즉, 첫 번째 예에서 InitialState는 인수가 제공되지 않은 경우에만 새 개체를 생성합니다.

class MyStateMachine
{
    public function __construct(
        private State $state = new InitialState(),
    ) {
    }
}
new MyStateMachine(new DraftState()); // No InitialState is created
new MyStateMachine(); // But now it is
로그인 후 복사

예를 들어 속성의 경우 반사 속성에서 newInstance가 호출되는 경우에만 개체가 생성됩니다.

#클래스 속성에 없음

클래스 속성에서는 new를 기본값으로 사용할 수 없다는 점도 알아야 합니다. 이 기능을 지원하면 예를 들어 개체를 직렬화 및 역직렬화할 때 예상치 못한 여러 가지 부작용이 발생합니다.

class MyStateMachine
{
    private State $state = new InitialState();
}
로그인 후 복사

다행스럽게도 기본값을 허용하는 호이스트 속성이 있습니다. PHP는 속성 호이스트 구문을 변환하여 생성자 매개변수의 기본값을 유지하지만 실제 속성에서는 유지하지 않기 때문입니다.

번역된 버전은 다음과 같습니다.

class MyStateMachine
{
    private State $state;
    
    public function __construct(
        State $state = new InitialState(),
    ) {
        $this->state = $state;
    }
}
로그인 후 복사

#FINED INPUTS

짐작하셨을 수도 있지만 이니셜라이저에서 새 객체를 생성할 때 제한된 입력 세트만 전달할 수 있습니다. 예를 들어 변수, 스프레드 연산자, 익명 클래스 등을 사용할 수 없습니다. 그래도 매우 환영할 만한 추가 사항입니다!

위 내용은 PHP8.1 새로운 기능 설명 초기화 초기화의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!