여러 Trait 사용하기
Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 91개 중 52번째.
단일 trait도 유용하지만, 진정한 힘은 하나의 클래스에서 여러 trait를 결합할 때 발휘됩니다. PHP에서는 필요한 만큼 많은 trait를 포함할 수 있으므로, 클래스에 여러 소스의 기능을 한 번에 제공할 수 있습니다.
여러 trait를 사용하려면 use 키워드 뒤에 쉼표로 구분하여 나열하기만 하면 됩니다:
<?php
trait Timestampable {
public function getTimestamp(): string {
return date('Y-m-d H:i:s');
}
}
trait Identifiable {
private string $id;
public function generateId(): void {
$this->id = uniqid('id_');
}
public function getId(): string {
return $this->id;
}
}
class Post {
use Timestampable, Identifiable;
public function __construct(public string $title) {
$this->generateId();
}
}
$post = new Post("Hello World");
echo $post->getId() . " - " . $post->getTimestamp();
출력:
id_6789abc123 - 2024-01-15 10:30:00이제 Post 클래스에는 두 trait의 메서드가 모두 포함되어 있습니다. 각 trait는 고유한 기능을 제공합니다. Timestampable은 시간 관련 메서드를 제공하고, Identifiable은 고유 ID를 처리합니다. 이 접근 방식은 각 trait가 단일 책임에 집중하도록 하여 코드를 더욱 모듈화하고 재사용하기 쉽게 만듭니다.
두 trait에 같은 이름의 methods가 있으면 어떻게 될까요? 다음 레슨에서 살펴볼 conflict 상황입니다.
챌린지
쉬움제품에 가격 책정 및 재고 관리 기능을 모두 제공하도록 여러 트레이트를 결합하는 제품 관리 시스템을 만들어 보겠습니다. 각 트레이트는 하나의 책임을 담당하며, product class는 두 트레이트 모두로부터 기능을 얻게 됩니다.
코드를 세 개의 파일로 구성합니다:
Priceable.php: 가격 책정 기능을 처리하는Priceable트레이트를 Create합니다. 트레이트에는 다음이 있어야 합니다:- private property
$price(float) - 가격을 저장하는
setPrice(float $price)method - 가격을 반환하는
getPrice()method - 가격을 소수점 이하 2자리로
"$[price]"형식으로 반환하는getFormattedPrice()method
- private property
Stockable.php: 재고를 관리하는Stockable트레이트를 Create합니다. 트레이트에는 다음이 있어야 합니다:- private property
$stock(integer) - 재고 수량을 저장하는
setStock(int $quantity)method - current stock을 반환하는
getStock()method - stock이 0보다 크면
true, otherwisefalse를 반환하는isInStock()method
- private property
main.php: 두 트레이트 파일을 모두 포함하고Priceable및Stockable트레이트를 모두 사용하는Productclass를 Create합니다. constructor promotion을 사용하여 public$nameproperty를 정의합니다. constructor는 price와 stock quantity도 accept하고, 트레이트 methods를 사용하여 이를 설정해야 합니다.세 가지 입력을 받습니다: product name, price, stock quantity입니다. 이 값으로 product를 Create하고 다음 네 줄을 Print합니다:
- product name
- formatted price (
getFormattedPrice()사용) - stock quantity
- 재고가 있으면
"Available", 그렇지 않으면"Out of stock"
이 예제는 여러 트레이트가 함께 작동하는 방식을 보여 줍니다. Product class는 한 트레이트에서 pricing capabilities를, 다른 트레이트에서 inventory management를 얻으므로 각 concern을 깔끔하게 분리하면서도 모든 기능을 갖춘 product로 결합할 수 있습니다.
직접 해보기
<?php
require_once 'Priceable.php';
require_once 'Stockable.php';
// TODO: Priceable와 Stockable 트레이트를 모두 사용하는 Product 클래스를 생성하세요
// public $name 속성에 생성자 프로모션을 사용하세요
// 생성자는 name, price, stock을 받고, 트레이트 메서드를 사용하여 price와 stock을 설정해야 합니다
class Product {
// TODO: 여기에 트레이트를 사용하세요
// TODO: $name에 대한 생성자 프로모션으로 생성자를 구현하세요
// 그리고 트레이트 메서드를 사용하여 price와 stock을 설정하세요
}
// 입력 읽기
$name = trim(fgets(STDIN));
$price = floatval(trim(fgets(STDIN)));
$stock = intval(trim(fgets(STDIN)));
// TODO: 입력 값으로 Product 인스턴스를 생성하세요
// TODO: 제품 이름을 출력하세요
// TODO: getFormattedPrice()를 사용하여 형식화된 가격을 출력하세요
// TODO: 재고 수량을 출력하세요
// TODO: 재고가 있으면 "Available"을 출력하고, 없으면 "Out of stock"을 출력하세요
?>이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 PHP 컴파일러