PHP의 디자인 패턴 소개

게시 됨: 2020-04-14

PHP 디자인 패턴은 개발자에게 매우 유용한 것으로 입증되었으며 주요 문제 해결사입니다. 효율적인 코드를 작성하려면 개발자는 모범 사례를 따라야 합니다. PHP 디자인 패턴은 이제 Drupal 8 프로젝트에서도 사용되는 객체 지향 프로그래밍(OOP) 개념입니다. 최신 PHP 및 OOP 개념을 채택한 Drupal 8을 통해 보다 깨끗하고 강력한 프로그래밍을 위해 디자인 패턴을 활용할 수 있습니다.

PHP의 디자인 패턴

PHP의 디자인 패턴이란?

소프트웨어 엔지니어링에서 디자인 패턴은 소프트웨어 디자인에서 일반적으로 발생하는 문제에 대한 일반적으로 반복 가능한 솔루션입니다. 좋은 객체 지향 디자인은 재사용 가능하고 유지 관리 가능하며 확장 가능해야 하며 PHP의 디자인 패턴은 그렇게 하는 데 매우 유용할 수 있습니다. 이는 문제 해결에 도움이 될 뿐만 아니라 일반적인 문제를 해결하는 최적의 방법을 의미합니다.

PHP 디자인 패턴 사용의 이점

PHP에서 디자인 패턴의 주요 이점은 다음과 같습니다.

  • PHP 디자인 패턴은 개발 중에 직면한 반복적인 문제를 해결하는 데 도움이 됩니다.
  • PHP에서 디자인 패턴을 사용하면 디자이너 간의 보다 효율적인 커뮤니케이션이 가능합니다.
  • 코드가 디자인 패턴으로 잘 구성되어 있으므로 코드를 보고 있는 다른 개발자가 이해하는 데 어려움을 겪지 않아도 됩니다.
  • 모범 사례를 따르면 더 강력한 소프트웨어를 구축하는 데 도움이 됩니다.
  • 개발을 더 빠르고 쉽게 만드는 데 도움이 됩니다.

PHP에서 널리 사용되는 디자인 패턴

디자인 패턴은 유사한 문제를 해결하기 위해 다양한 상황에서 사용될 수 있습니다. 생성 패턴, 구조 패턴 및 행동 패턴의 세 가지 유형의 디자인 패턴으로 크게 분류할 수 있는 약 23개의 디자인 패턴이 있습니다.

생성 패턴: 객체 생성 메커니즘에 사용되는 디자인 패턴으로, 객체를 구현한 시스템에서 분리할 수 있는 객체를 생성합니다.

구조적 패턴: 엔티티 간의 관계를 실현하는 간단한 방법을 식별하여 설계를 용이하게 합니다.

행동 패턴: 객체 간의 관계, 책임 및 알고리즘을 관리하는 데 사용됩니다.

공장 패턴

팩토리 패턴은 객체를 빌드하는 데 사용됩니다. 맞습니다. 개체를 만들지 말고 개체를 만드십시오. 객체를 빌드할 때 먼저 생성한 다음 초기화합니다. 일반적으로 특정 논리를 적용하고 여러 단계를 수행해야 합니다. 이를 통해 모든 것을 한 장소에 보관하고 같은 방식으로 새 객체를 구축해야 할 때마다 재사용하는 것이 합리적입니다. 기본적으로 팩토리 패턴을 사용하는 것입니다.
우리 팩토리에 대한 인터페이스를 갖고 우리 코드가 콘크리트 팩토리가 아닌 그것에 의존하도록 하는 것은 좋은 생각입니다.

 상호 작용 FamilyFactory인터페이스 {
    공공의 기능 생성 () : 패밀리
}

다음으로 다음 클래스를 사용하여 팩토리 인터페이스를 구현합니다.

등급 패밀리팩토리 도구 FamilyFactory인터페이스 {

공공의 기능 생성 () : 가족 {

$패밀리 = 새로운 패밀리();

// 가족 초기화

반환 $ 가족;

}

}

어댑터 패턴

어댑터 디자인 패턴에서 클래스는 한 클래스의 인터페이스를 다른 클래스로 변환합니다. 이 예제에는 getTitle() 및 getAuthor() 메서드가 있는 TextBook 클래스가 있습니다. 클라이언트는 getTitleAndAuthor() 메소드를 기대합니다. demoAdapterSimpleBook 을 "적응" 하기 위해 TextBook 의 인스턴스를 가져오고 고유한 getTitleAndAuthor 메서드에서 TextBook getTitle() 및 getAuthor() 메서드를 사용하는 어댑터 클래스인 BookAdapter가 있습니다.

<?php

등급 교과서 {

개인 $title;
개인 $저자;
기능 __구성 ($title_in, $author_in) {
$this ->title = $title_in;

$this -> 저자 = $author_in;
}

기능 getTitle () {
반품 $this ->제목;
}
기능 getAuthor () {
반품 $this -> 저자;
}
}

등급 북어댑터 {
개인 $ 책;
기능 __construct (교과서 $ book_in) {
$this -> 책 = $book_in;
}
기능 getTitleAndAuthors () {
반품 $this -> book->getTitle(). 에 의해 ' . $this ->책->getAuthor();
}
}

// 고객

writeln( '어댑터 패턴 테스트 시작' );
writeln( '' );

$book = new TextBook( "감마, ​​투구, 존슨, 블리 사이드 " , "디자인 패턴" );
$bookAdapter = 새로운 BookAdapter($book);
writeln( '저자 및 제목: ' .$bookAdapter->getTitleAndAuthor());
writeln( '' );

writeln( '어댑터 패턴 테스트 종료' );

기능 writeln ($line_in) {
에코 $line_in. "<br/>" ;
}

?>

PHP 싱글톤 패턴

클래스의 인스턴스화를 단일 객체로 제한하기 위해 PHP의 싱글톤 패턴이 사용됩니다. 이것은 시스템 전체에서 하나의 개체만 필요할 때 유용할 수 있습니다. 웹 애플리케이션을 디자인하는 동안 특정 클래스의 하나의 인스턴스에만 액세스를 허용하는 것이 합리적입니다. Singleton 패턴 클래스에서 명시적으로 개체가 생성되는 것을 방지하기 위해 private 생성자를 사용합니다.

<?php
등급 하나씩 일어나는 것
{
공공의 공전 기능 getInstance ()
{
정적 $instance = null ;
if ( null === $instance) {
$instance = 신규 정적 ();
}
$instance 반환 ;
}
보호받는 기능 __구성 ()
{
}
사적인 기능 __클론 ()
{
}
사적인 기능 __웨이크업 ()
{
}
}
등급 싱글톤차일드 연장하다 하나씩 일어나는 것
{
}
$obj = 싱글톤::getInstance();
var_dump($obj === 싱글톤::getInstance());
$obj2 = SingletonChild::getInstance();
var_dump($obj2 === 싱글톤::getInstance());
var_dump($obj2 === SingletonChild::getInstance());
?>

PHP의 관찰자 패턴

PHP 옵저버 패턴은 특정 장소의 특정 이벤트에 대해 나머지 시스템에 경고하는 데 사용됩니다.
예를 들어, 비평가들에게 영화를 보여주기 위해 극장 을 만들어야 하는 경우입니다. 우리는 현재 메소드로 Theatre 클래스를 정의합니다. 영화를 상영하기 전에 평론가들의 휴대폰으로 메시지를 보내고 싶다. 그런 다음 영화 중간에 비평가들에게 휴식 시간을 주기 위해 5분 동안 영화를 멈추고 싶습니다. 마지막으로, 영화가 끝난 후 비평가들에게 그들의 반응을 남겨달라고 요청하고 싶습니다. 따라서 PHP용 옵저버 패턴에서 옵저버 객체는 상태가 변경될 때만 알림을 받습니다.

코드는 이렇게 생겼습니다 -

등급 극장 {

공공의 기능 현재 (영화 $movie) : 무효 {

$critics = $movie->getCritics();
$this ->message->send($critics, '...' );

$movie->play();

$movie->일시정지( 5 );
$this ->progress->interval($critics)
$movie->end();

$this ->response->request($critics);
}
}

PHP용 데코레이터 패턴

Decorator 패턴은 런타임에 객체의 특성을 변경하여 불필요한 상속과 클래스 수를 줄이고 싶을 때 사용합니다. 예를 들어 설명할 수 있습니다. 소파와 침대 클래스가 있고 둘 다 SleeperInterface를 구현한다고 가정해 보겠습니다.

상호 작용 슬리퍼 인터페이스 {
공공의 기능 수면 () : 무효;
}
등급 소파 도구 슬리퍼 인터페이스 {
공공의 기능 수면 () : 무효 {
// 소파에서 잔다
}
}
등급 침대 도구 슬리퍼 인터페이스 {
공공의 기능 수면 () : 무효 {
// 침대에서 잔다
}
}

소파와 침대는 모두 같은 행동을 취합니다. 이제 우리는 소파나 침대에서 잘 때 수면 추적을 사용자에게 알려주는 추가 기능이 있는 다른 소파와 침대가 필요합니다. 상속을 사용하면 다음과 같이 이 문제를 해결할 수 있습니다.

등급 스마트소파 연장하다 소파 {
공용 함수 sleep() : 무효 {
부모::수면();
$ this ->sleepHours();
}
}
등급 스마트베드 연장하다 {
공용 함수 sleep() : 무효 {
부모::수면();
$ this ->sleepHours();
}
}

이제 총 4개의 클래스가 있습니다. 그러나 우리는 Decorator 패턴으로만 3개의 클래스로 이 문제를 해결할 수 있습니다. 방법은 다음과 같습니다.

등급 스마트슬리퍼 도구 슬리퍼 인터페이스 {

개인 $sleeper;
공공의 기능 __construct (SleeperInterface $ 침대) {
$this ->sleeper = $sleeper;
}

공공의 기능 수면 () : 무효 {
$this ->sleeper->sleep();
$this ->sleepHours();
}
}
$ 소파 = 새로운 소파();
$침대 = 침대();
$smartSofa = 새로운 SmartSleeper($sofa);
$smartBed = 새로운 SmartSleeper($bed);

여기에서 프록시처럼 작동하지만 그 위에 추가 기능이 있는 새로운 유형의 슬리퍼를 도입했습니다.

Drupal 8의 디자인 패턴 활용

Drupal 8 이전에는 Drupal에 이미 많은 디자인 패턴이 설정되어 있지만 이제 Drupal 8은 이전에 사용할 수 없었던 많은 패턴으로 구성됩니다. 이러한 새로운 패턴 중 일부는 일부 이전 패턴을 완전히 대체하고 다른 일부는 Drupal 8에 몇 가지 새로운 기능을 도입합니다.

Drupal 8에서 사용되는 디자인 패턴은 다음과 같습니다.

  • 객체 지향 프로그래밍 패턴(OOP)
  • 의존성 주입
  • 공장 패턴
  • 싱글톤 패턴

OOP는 실제로 단일 패턴이 아니라 디자인 패턴을 훨씬 뛰어넘는 코드를 개념화하고 구조화하는 완전히 급진적인 방법입니다. 이것은 Drupal 8에서 사용되는 것을 포함하여 오늘날 사용되는 많은 인기 있는 소프트웨어 디자인 패턴의 기초입니다. Drupal 7에서 도입되었지만 광범위하게 사용되지 않았고 필요하지도 않았습니다. 이제 Drupal 8의 상황은 달라졌고, 널리 사용되고 있으며, 필수입니다.

의존성 주입

종속성 주입은 하드 코딩된 종속성을 제거하고 런타임 또는 컴파일 타임에 변경할 수 있도록 하는 소프트웨어 디자인 패턴입니다. 종속성 주입을 추가하는 것은 쉽고 기존 코드와 간섭하지 않습니다. Drupal 8은 재사용 가능한 기능을 분리하기 위해 서비스 개념을 도입했습니다. core.services.yml은 Drupal 8의 의존성 주입 예제입니다. 위에서 PHP의 Factory Pattern 및 Singleton Pattern에 대해 이미 논의했습니다.