在之前的文章《浅谈PHP中的迭代器模式》中我们介绍了PHP中的迭代器模式,下面本篇文章带大家了解一下PHP中的原型模式。
原型模式其实更形象的来说应该叫克隆模式。它主要的行为是对对象进行克隆,但是又把被克隆的对象称之为最初的原型,于是,这个模式就这样被命名了。说真的,从使用方式来看真的感觉叫克隆模式更贴切一些。
GoF定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
GoF类图:
代码实现:
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();
客户端使用clone来复制p2也具有相同的$v属性。
< em>Notre Comment le système d'exploitation mobile (vous pouvez aussi imaginer le système d'exploitation d'un PC) est-il installé sur l'appareil ? En fait, ils copient et copient constamment le système d'origine
完整代码:https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fzhangyue0503%2Fdesignpatterns-php%2Fblob%2Fmaster%2F08.prototype%2Fsource%2Fprototype.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 = 'TD-CDMA'; $cmPhone1 = clone $cmPhone; $cmPhone1->service_province->system = 'TD-CDMA1'; 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 = 'WCDMA'; $cuPhone1 = clone $cuPhone; $cuPhone1->rom = "128G"; $cuPhone1->service_province->system = 'WCDMA1'; var_dump($cuPhone); var_dump($cuPhone1); echo $cuPhone->service_province->getSystem(); echo $cuPhone1->service_province->getSystem();
Parlons encore des téléphones portables Cette fois nous développons en fonction des besoins des différents opérateurs Un lot. de téléphones personnalisés, c'est-à-dire des téléphones packagés说明:Pour être honnête, ces lots de téléphones mobiles ne sont pas différents. La plupart d'entre eux ont la même configuration, mais les systèmes d'opérateur sont différents, et parfois certains modèles peuvent avoir un processeur et une mémoire différents打印了很多东西呀,不过主要的还是看看移动手机,也就是CMPhone中的__clone()方法,我们没有重新去初始化一个新对象。这时,复制的Ceci. À l'heure actuelle, nous pouvons utiliser le mode prototype pour copier rapidement et modifier uniquement certaines des différentes partiescmPhone中的是同一个对象。没错,这就是引用的复制问题。引用只是复制了引用的地址,他们指向的是同一个对象。当
🎜
🎜🎜🎜
J'ai imprimé beaucoup de choses, mais l'essentiel est de regarder le téléphone portable, c'est-à-dire la méthode __clone() dans CMPhone We. Je ne l'ai pas revu. Initialiser un nouvel objet🎜À ce moment, le cmPhone. est le même objet🎜Non faux, c'est un problème de copie de référence🎜La référence copie simplement l'adresse de référence, elle pointe vers le même objet🎜Dang
Les attributs de l'objet service_province dans cmPhone ont également changé.
Dans CUPhone, nous avons créé un nouvel objet service_province. Cette fois, la valeur de l'objet de référence dans
cuPhone à l'extérieur.
Adresse originale : https://juejin.cn/post/6844903942220939272
Auteur : Hardcore Project Manager
Apprentissage recommandé : "Tutoriel vidéo PHP"
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!