> 백엔드 개발 > PHP 튜토리얼 > PHP 뉴스: 생성자 속성 승격

PHP 뉴스: 생성자 속성 승격

Susan Sarandon
풀어 주다: 2024-12-14 06:41:11
원래의
813명이 탐색했습니다.

PHP ews: Constructor Property Promotion

생성자 속성 승격은 클래스 내에서 속성 선언 및 초기화를 단순화하는 PHP 8에 도입된 기능입니다. PHP 8 이전에는 클래스 속성을 명시적으로 선언한 다음 생성자 내에서 초기화해야 했습니다. 이 기능을 사용하면 생성자의 매개변수 목록에서 직접 속성을 선언하고 초기화할 수 있으므로 상용구 코드가 줄어듭니다.

전통적인 구문(PHP 8 이전)

class Product {
    private string $name;
    private float $price;

    public function __construct(string $name, float $price) {
        $this->name = $name;
        $this->price = $price;
    }
}
로그인 후 복사
로그인 후 복사

건축자 속성 승격 구문(PHP 8)

class Product {
    public function __construct(
        private string $name,
        private float $price
    ) {}
}
로그인 후 복사
로그인 후 복사

혜택

  1. 상용구 코드 감소:

    • 생성자 외부에서 속성을 선언하고 수동으로 초기화할 필요가 없습니다.
  2. 가독성 향상:

    • 특히 속성이 많은 클래스에서 코드를 더욱 간결하고 이해하기 쉽게 만듭니다.
  3. 불변성 지원:

    • 초기화 후 변경을 방지하기 위해 속성을 읽기 전용으로 표시할 수 있습니다(PHP 8.1에서 도입됨).

메모

  1. 가시성 수정자:

    • 홍보된 속성에는 공개 수정자(비공개, 보호 또는 공개)가 포함되어야 합니다.
  2. 기본값:

    • 승격된 속성에 대해 기본값을 직접 설정할 수는 없지만 생성자에서 기본 인수 값을 사용할 수 있습니다.
    class Product {
       public function __construct(
           private string $name = 'Unnamed',
           private float $price = 0.0
       ) {}
    }
    
    로그인 후 복사
    로그인 후 복사
  3. 홍보 속성과 비홍보 속성 혼합:

    • 같은 클래스에서 기존 속성과 승격 속성을 결합할 수 있습니다.
    class Product {
       private string $category;
    
       public function __construct(
           private string $name,
           private float $price
       ) {
           $this->category = 'General';
       }
    }
    
    로그인 후 복사
    로그인 후 복사

사용 사례

생성자 속성 승격은 주요 목적이 데이터 저장인 DTO(Data Transfer Objects)와 같은 간단한 클래스에 특히 유용합니다.

class CustomerDTO {
    public function __construct(
        public string $name,
        public string $email,
        public ?string $phone = null
    ) {}
}
로그인 후 복사

결론

생성자 속성 승격은 생산성을 향상하고 코드 복잡성을 줄이는 PHP 8의 강력한 기능입니다. 간결하고 명확한 초기화가 필요한 여러 속성이 있는 클래스에 이상적입니다.

속성 통합

PHP 8에서는 속성(주석이라고도 함)을 생성자 속성 승격과 원활하게 결합할 수 있어 특히 메타데이터를 속성과 연결해야 하는 시나리오에서 더욱 깔끔하고 표현력이 풍부한 코드를 생성할 수 있습니다.

건설사 부동산 프로모션과의 통합

생성자 속성 승격을 사용하면 속성이 생성자에서 직접 정의됩니다. 속성을 별도로 선언할 필요 없이 속성을 사용하여 이러한 속성을 장식하고 상황에 맞는 정보를 추가할 수 있습니다.

실제예

DTO(데이터 전송 객체) 작업 중이고 속성을 데이터베이스 열에 매핑한다고 가정해 보겠습니다.

건축자 부동산 프로모션 없음

class Product {
    private string $name;
    private float $price;

    public function __construct(string $name, float $price) {
        $this->name = $name;
        $this->price = $price;
    }
}
로그인 후 복사
로그인 후 복사

건축자 부동산 프로모션 포함

class Product {
    public function __construct(
        private string $name,
        private float $price
    ) {}
}
로그인 후 복사
로그인 후 복사

통합의 이점

  1. 줄어든 상용구 코드:

    • 승격된 속성은 중복 선언을 제거하고 속성을 생성자의 속성에 직접 적용할 수 있습니다.
  2. 더 깔끔하고 읽기 쉬운 코드:

    • 통합을 통해 초기화, 메타데이터, 가시성이 한 곳에 결합됩니다.
  3. 반영을 통한 유연성:

    • PHP의 Reflection API를 사용하여 승격된 속성에 적용된 속성에 액세스하고 처리할 수 있습니다.

리플렉션을 통해 속성에 액세스

class Product {
   public function __construct(
       private string $name = 'Unnamed',
       private float $price = 0.0
   ) {}
}
로그인 후 복사
로그인 후 복사

코드 설명

  1. 열 속성 정의:

    • #[Attribute] 데코레이터는 Column 클래스가 속성임을 나타냅니다.
    • 속성 클래스는 속성을 데이터베이스 열과 연결하는 데 사용되는 단일 매개변수 이름을 허용합니다.
  2. 생성자 매개변수에 속성 ​​추가:

    • #[Column('user_id')] 및 #[Column('username')]과 같은 속성이 생성자 매개변수 id 및 name에 추가됩니다.
  3. 반사 사용:

    • ReflectionClass 개체는 User 클래스에 대해 생성되어 해당 속성과 메서드를 검사할 수 있습니다.
  4. 생성자 액세스:

    • getConstructor()는 User 클래스의 생성자를 검색합니다.
  5. 매개변수 반복:

    • getParameters()는 생성자의 모든 매개변수를 검색합니다.
  6. 속성 가져오는 중:

    • getAttributes(Column::class)는 매개변수에 적용된 Column 유형의 모든 속성을 검색합니다.
  7. 속성 인스턴스화:

    • newInstance()는 Column 속성의 인스턴스를 생성하여 name 속성에 대한 액세스를 제공합니다.
  8. 메타데이터 인쇄:

    • 매개변수 이름(예: id) 및 관련 열 이름(예: user_id)을 콘솔에 출력합니다.

출력:

class Product {
   private string $category;

   public function __construct(
       private string $name,
       private float $price
   ) {
       $this->category = 'General';
   }
}
로그인 후 복사
로그인 후 복사

일반적인 사용 사례

  1. 데이터베이스 매핑:

    • #[Column]과 같은 속성을 사용하여 데이터베이스 열을 지정합니다.
  2. 데이터 검증:

    • #[NotNull] 또는 #[MaxLength(255)]와 같은 속성에 유효성 검사를 직접 적용합니다.
  3. 직렬화/역직렬화:

    • JSON 필드에 속성 매핑(예: #[JsonField('user_name')].

결론

생성자 속성 승격속성의 통합은 PHP에서 클래스를 구조화하는 강력하고 간결한 방법을 제공합니다. 이는 ORM, 유효성 검사 또는 직렬화와 같은 메타데이터에 의존하여 코드를 더욱 표현적이고 체계적으로 만드는 시스템에 특히 유용합니다.

위 내용은 PHP 뉴스: 생성자 속성 승격의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿