>  기사  >  백엔드 개발  >  한 기사에서 PHP의 프로토타입 패턴에 대해 알아보세요.

한 기사에서 PHP의 프로토타입 패턴에 대해 알아보세요.

青灯夜游
青灯夜游앞으로
2021-07-07 19:22:582963검색

이전 기사 "A Brief Talk on the Iterator Pattern in PHP"에서 PHP의 반복자 패턴을 소개했습니다. 이 기사에서는 PHP의 프로토타입 패턴을 이해하는 데 도움이 됩니다.

한 기사에서 PHP의 프로토타입 패턴에 대해 알아보세요.

프로토타입 모드는 실제로 클론 모드라고 더 생생하게 불러야 합니다. 주요 동작은 객체를 복제하는 것이지만 복제된 객체를 원래 프로토타입이라고 부르기 때문에 이 패턴의 이름이 지정됩니다. 솔직히 사용법만 보면 클론 모드라고 부르는 게 더 적절할 것 같습니다.

Gof 클래스 다이어그램 및 설명

GoF 정의: 프로토타입 인스턴스를 사용하여 생성할 개체 유형을 지정하고 이러한 프로토타입을 복사하여 새 개체를 만듭니다.

GoF 클래스 다이어그램:

한 기사에서 PHP의 프로토타입 패턴에 대해 알아보세요.

코드 구현:

abstract class Prototype
{
    public $v = 'clone' . PHP_EOL;

    public function __construct()
    {
        echo 'create' . PHP_EOL;
    }

    abstract public function __clone();
}

먼저 시뮬레이션을 통해 프로토타입을 정의합니다. 여기서는 주로 __clone() 메서드를 시뮬레이션합니다. 사실 이것은 PHP와 함께 제공되는 마법의 메서드입니다. 이를 정의할 필요가 전혀 없으며 프로토타입 클래스에서만 구현하면 됩니다. 개체를 복제하기 위해 외부에서 clone 키워드를 사용하는 경우 이 매직 메서드를 직접 입력하게 됩니다. 이 매직 메서드에서는 속성, 특히 참조 속성에 대한 일부 고유한 처리를 처리할 수 있습니다. 이 예에서는 값 유형 변수만 사용했습니다. 참조 유형의 문제는 반영되지 않습니다. 참조 유형 변수의 처리는 나중에 예제에서 설명하겠습니다.

class ConcretePrototype1 extends Prototype
{
    public function __clone()
    {
    }
}

class ConcretePrototype2 extends Prototype
{
    public function __clone()
    {
    }
}

시뮬레이션의 특정 구현의 프로토타입은 실제로 __clone() 메서드의 주요 구현입니다. 이에 대해서는 나중에 구체적인 예를 살펴보면서 설명하겠습니다.

class Client
{
    public function operation()
    {
        $p1 = new ConcretePrototype1();
        $p2 = clone $p1;

        echo $p1->v;
        echo $p2->v;
    }
}

$c = new Client();
$c->operation();

클라이언트는 복제를 사용하여 한 기사에서 PHP의 프로토타입 패턴에 대해 알아보세요.p2도 동일한 $v 속성을 갖습니다.

  • 프로토타입 모드에서는 같은 객체를 복사하는 것처럼 보이지만, 복사할 때 __construct() 메서드가 호출되지 않는다는 점, 즉 이 코드를 실행하면 create가 한 번만 출력된다는 점 주의하시기 바랍니다. 이는 또한 프로토타입 패턴의 가장 큰 특징 중 하나인 객체 생성 오버헤드 감소를 이끌어냅니다.
  • 위의 특성을 바탕으로 많은 수의 동일한 개체를 배열에 채우려는 경우와 같이 많은 수의 동일한 개체를 빠르게 복사할 수 있습니다.
  • 복사된 객체가 모두 값 유형 속성인 경우 프로토타입에 영향을 주지 않고 임의로 수정할 수 있습니다. 참조 유형 변수가 있는 경우 __clone() 메서드에서 일부 처리를 수행해야 합니다. 그렇지 않으면 복사된 객체의 참조 변수 내용을 수정하면 프로토타입 객체의 내용에 영향을 미칩니다.

우리 휴대폰 운영체제(PC의 운영체제도 상상할 수 있음)는 기기에 어떻게 설치되어 있나요? 실제로 그들은 원본 시스템을 끊임없이 복사하고 복사하고 있습니다. 마이크로소프트의 사례는 이 문제를 잘 설명한다. 당시 마이크로소프트가 제국이 될 수 있었던 것은 윈도우즈 운영체제를 계속해서 CD로 복사해 수천 가구에 팔았기 때문이다(물론 잘못된 것은 아니다). 여기 중국과 함께). 중국 시장의 경우, 많은 전문가들이 Windows를 크랙하고 이 파일을 우리 컴퓨터에 설치하기 전에 지속적으로 복사했습니다. 휴대폰, 스마트기기 등 다양한 제품의 운영체제와 소프트웨어도 마찬가지다. 하나의 개발을 무제한으로 복사할 수 있다는 것은 소프트웨어 산업에서 막대한 이익을 얻을 수 있는 이유입니다. 결국 우리 시스템은 수많은 엔지니어들이 밤낮으로 작업한 안드로이드 네이티브 시스템을 기반으로 개발되었기 때문에 서둘러서 곧 출시될 휴대폰에 복사해 두시기 바랍니다! !

完整代码:https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fzhangyue0503%2Fdesignpatterns-php%2Fblob%2Fmaster%2F08.prototype%2Fsource%2Fprototype.php

Example

그리고 이번에는 휴대폰에 대해서도 이야기해보겠습니다. 이번에는 다양한 사업자의 요구에 맞는 맞춤형 휴대폰, 즉 패키지 휴대폰을 개발하고 있습니다. 솔직히 말해서, 이들 휴대폰은 대부분 동일한 구성을 가지고 있지만, 통신사 시스템이 다르고, 가끔 일부 모델은 CPU와 메모리가 다를 수 있습니다. 이때 프로토타입 모드를 사용하면 차이점 중 일부만 빠르게 복사하고 수정할 수 있습니다.

프로토타입 모드 제작 휴대폰 클래스 다이어그램:

한 기사에서 PHP의 프로토타입 패턴에 대해 알아보세요.

完整源码:https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fzhangyue0503%2Fdesignpatterns-php%2Fblob%2Fmaster%2F08.prototype%2Fsource%2Fprototype-phone.php
<?php
interface ServiceProvicer
{
    public function getSystem();
}

class ChinaMobile implements ServiceProvicer
{
    public $system;
    public function getSystem(){
        return "中国移动" . $this->system;
    }
}
class ChinaUnicom implements ServiceProvicer
{
    public $system;
    public function getSystem(){
        return "中国联通" . $this->system;
    }
}

class Phone 
{
    public $service_province;
    public $cpu;
    public $rom;
}

class CMPhone extends Phone
{
    function __clone()
    {
        // $this->service_province = new ChinaMobile();
    }
}

class CUPhone extends Phone
{
    function __clone()
    {
        $this->service_province = new ChinaUnicom();
    }
}


$cmPhone = new CMPhone();
$cmPhone->cpu = "1.4G";
$cmPhone->rom = "64G";
$cmPhone->service_province = new ChinaMobile();
$cmPhone->service_province->system = &#39;TD-CDMA&#39;;
$cmPhone1 = clone $cmPhone;
$cmPhone1->service_province->system = &#39;TD-CDMA1&#39;;

var_dump($cmPhone);
var_dump($cmPhone1);
echo $cmPhone->service_province->getSystem();
echo $cmPhone1->service_province->getSystem();


$cuPhone = new CUPhone();
$cuPhone->cpu = "1.4G";
$cuPhone->rom = "64G";
$cuPhone->service_province = new ChinaUnicom();
$cuPhone->service_province->system = &#39;WCDMA&#39;;
$cuPhone1 = clone $cuPhone;
$cuPhone1->rom = "128G";
$cuPhone1->service_province->system = &#39;WCDMA1&#39;;

var_dump($cuPhone);
var_dump($cuPhone1);
echo $cuPhone->service_province->getSystem();
echo $cuPhone1->service_province->getSystem();

설명:

  • 많은 것을 인쇄했지만 가장 중요한 것은 휴대폰을 보는 것입니다. 즉 __clone( ) CMPhone의 메서드에서는 새 개체를 다시 초기화하지 않았습니다. 이때 복사된 한 기사에서 PHP의 프로토타입 패턴에 대해 알아보세요.cmPhone에는 동일한 개체가 포함되어 있습니다. 예, 이것은 참조 중복 문제입니다. 참조는 참조의 주소를 복사할 뿐이며 동일한 개체를 가리킵니다. 언제

    cmPhone의 service_province 개체 속성도 변경되었습니다.

  • CUPhone에서는 새로운 service_province 개체를 만들었습니다. 이번에는 외부

    cuPhone에 있는 참조 개체의 값입니다.

  • 프로토타입 모드에서 가장 중요한 것은 위의 두 가지 사항에 주의하는 것입니다. 반면 일반 값 속성은 직접 복사되므로 이러한 문제가 발생하지 않습니다. 여기에는 두 가지 다른 개념이 포함됩니다: Shallow copyDeep copy
  • Shallow copy는 복사된 객체의 모든 변수가 원본 객체와 동일한 값을 포함하고 다른 객체에 대한 모든 참조가 유지된다는 것을 의미합니다. 원본 객체
  • 딥 카피는 참조 객체의 변수가 원본 참조 객체가 아닌 복사된 새 객체를 가리킵니다
  • 참조 및 값에 관한 문제는 다른 글에서 설명할 예정이니 WeChat이나 Nuggets 계정에 주목해주세요

원본 주소: https://juejin.cn/post/6844903942220939272

저자: Hardcore Project Manager

추천 학습: "PHP 비디오 튜토리얼"

위 내용은 한 기사에서 PHP의 프로토타입 패턴에 대해 알아보세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제