PHP 8의 디자인 패턴: 프로토타입
7767 단어 oopwebdevphpprogramming
디자인 패턴 Prototype은 객체의 복제본을 만드는 제어 기능을 제공합니다. PHP 구문에는 개체의 복사본을 만들기 위한 특수 키워드/명령
clone
이 있습니다. 그러나 다른 클래스의 구현인 일부 매개변수를 올바르게 복제할 수는 없습니다.블로그나 온라인 출판물을 개발할 때 접할 수 있는 예를 고려해 볼 것을 제안합니다. 이러한 리소스에서 기본 엔터티 중 하나는 물론 작성자가 있는 페이지입니다.
이것을 구현해 봅시다. 저자는 물론 이름과 이 저자의 페이지 목록을 갖게 됩니다. 이 경우 목록에는 ID뿐만 아니라 본격적인 페이지 개체가 포함됩니다.
class Author
{
public function __construct(
public readonly string $name,
private array $pages = []
) {}
public function addPage(Page $page): void
{
$this->pages[] = $page;
}
public function getPages(): array
{
return $this->pages;
}
}
또한 각 페이지에는 Author 클래스를 구현하는 작성자 속성이 있어야 합니다. 기타 필요한 데이터 이외에.
class Page
{
public function __construct(
private string $title,
private string $body,
public readonly Author $author,
private array $comments = [],
private \DateTime $date = new \DateTime()
) {
$this->author->addPage($this);
}
public function getTitle(): string
{
return $this->title;
}
public function setTitle(string $title): void
{
$this->title = $title;
}
public function getBody(): string
{
return $this->body;
}
public function setBody(string $body): void
{
$this->body = $body;
}
public function getComments(): array
{
return $this->comments;
}
public function addComment(string $comment): void
{
$this->comments[] = $comment;
}
public function getDate(): \DateTime
{
return $this->date;
}
}
이제 이러한 구조로 인해 페이지 복제는 PHP에서 쉬운 작업이 아닙니다. 그리고 이것은 저자가 자신의 기사 사본을 만들고자 하는 경우에 필요할 수 있으며, 향후 이를 기반으로 새 기사를 게시할 것입니다. 복잡한 개체를 복제하는 방법을 정확하게 구성할 수 있는 Prototype 템플릿이 있는 것은 바로 이러한 상황을 위한 것입니다.
Page 클래스에 마법 복제 방법의 구현을 추가해 보겠습니다. 여기에서 이 클래스의 개체를 복제하는 방법을 정확하게 설명합니다.
public function __clone()
{
$this->title = "Copy of " . $this->title;
$this->author->addPage($this);
$this->comments = [];
$this->date = new \DateTime();
}
물론 메서드에서 더 복잡한 논리를 구현할 수 있습니다. 실제로 페이지는 해당 속성에서 더 많은 다른 개체를 참조할 수 있습니다. 그런 경우 Prototype은 매우 유용한 접근 방식이 될 수 있습니다.
Reference
이 문제에 관하여(PHP 8의 디자인 패턴: 프로토타입), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/zhukmax/design-patterns-in-php-8-prototype-1kg1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)