생성자 프로모션 (8.0)
Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 91개 중 42번째.
PHP 8.0은 클래스를 정의할 때 상용구 코드(boilerplate code)를 획기적으로 줄여주는 기능인 생성자 프로모션(constructor promotion)을 도입했습니다. 프로퍼티를 별도로 선언하고 생성자에서 할당하는 대신, 한 단계에서 두 작업을 모두 수행할 수 있습니다.
여러분이 사용해 온 전통적인 방식은 다음과 같습니다:
<?php
class Product {
private string $name;
private float $price;
public function __construct(string $name, float $price) {
$this->name = $name;
$this->price = $price;
}
public function getInfo(): string {
return $this->name . ": $" . $this->price;
}
}
생성자 프로모션(constructor promotion)을 사용하면, 생성자 매개변수에 직접 접근 제어자를 추가할 수 있습니다:
<?php
class Product {
public function __construct(
private string $name,
private float $price
) {}
public function getInfo(): string {
return $this->name . ": $" . $this->price;
}
}
$product = new Product("Laptop", 999.99);
echo $product->getInfo();
출력:
Laptop: $999.99생성자 매개변수 앞에 private, protected 또는 public을 추가함으로써, PHP는 자동으로 속성을 생성하고 값을 할당합니다. 동일한 생성자 내에서 프로모션된 매개변수와 일반 매개변수를 혼합하여 사용할 수 있으며, 필요한 경우 생성자 본문 내에 로직을 여전히 추가할 수 있습니다.
핵심 포인트: 생성자 프로모션(Constructor promotion)은 반복적인 속성 선언과 할당을 제거하여, 완전한 캡슐화 제어를 유지하면서도 클래스를 더 깔끔하고 읽기 쉽게 만들어 줍니다.
챌린지
쉬움생성자 프로모션(constructor promotion)의 우아함을 보여주는 연락처 관리 시스템을 구축해 보겠습니다. 상용구 코드(boilerplate code)를 제거하면서도 적절한 캡슐화를 유지하는 깔끔하고 현대적인 PHP 클래스를 만들게 됩니다.
코드는 두 개의 파일로 구성됩니다:
Contact.php— 생성자 서명에서 직접 모든 속성을 정의하기 위해 생성자 프로모션을 사용하는Contact클래스를 생성합니다. 연락처는 다음을 포함해야 합니다:- private
$name속성 (string) - private
$email속성 (string) - 기본값이
"Not provided"인 private$phone속성 (string)
"[name] | [email] | [phone]"를 반환하는 public 메서드getFullDetails()를 추가하세요. 또한"Contact: [name]"를 반환하는getSummary()메서드도 추가하세요.- private
main.php— Contact 파일을 포함합니다. 이름, 이메일, 전화번호의 세 가지 입력을 받게 됩니다. 두 개의Contact인스턴스를 생성하세요:- 첫 번째 연락처는 세 가지 값(이름, 이메일, 전화번호)을 모두 사용해야 합니다.
- 두 번째 연락처는 이름과 이메일만 사용해야 합니다 (기본 전화번호 값에 의존).
- 첫 번째 연락처의 전체 상세 정보 (full details)
- 첫 번째 연락처의 요약 (summary)
- 두 번째 연락처의 전체 상세 정보 (full details)
- 두 번째 연락처의 요약 (summary)
생성자 프로모션을 통해 속성을 정의하고, 가시성을 설정하고, 타입을 선언하고, 값을 할당하는 이 모든 과정을 단일하고 가독성 있는 생성자 서명 내에서 어떻게 처리하는지 확인해 보세요. 기본값이 있는 선택적 phone 파라미터는 프로모션된 파라미터가 일반 파라미터와 마찬가지로 기본값과 원활하게 작동함을 보여줍니다.
직접 해보기
<?php
require_once 'Contact.php';
// 입력 읽기
$name = trim(fgets(STDIN));
$email = trim(fgets(STDIN));
$phone = trim(fgets(STDIN));
// TODO: 세 가지 값(이름, 이메일, 전화번호)을 모두 사용하여 첫 번째 연락처 생성
// TODO: 이름과 이메일만 사용하여 두 번째 연락처 생성 (기본 전화번호 사용)
// TODO: 첫 번째 연락처의 전체 상세 정보 출력
// TODO: 첫 번째 연락처의 요약 정보 출력
// TODO: 두 번째 연락처의 전체 상세 정보 출력
// TODO: 두 번째 연락처의 요약 정보 출력
?>이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
8매직 메서드
매직 메서드 소개__toString 및 __debugInfo__get, __set, __isset, __unset__call 및 __callStatic__clone 및 객체 복제__serialize 및 __unserialize요약 - 커스텀 컬렉션