Maison >développement back-end >tutoriel php >Découvrez le modèle de prototype en PHP dans un article
在之前的文章《浅谈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属性。
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.phpL'exemple de Microsoft illustre très bien ce problème. Microsoft a pu devenir un empire à l'époque, en fait, c'était parce qu'il continuait à copier le système d'exploitation Winodws sur le CD, puis vendu à des milliers de foyers (bien sûr, la Chine n'a rien à voir ici)实例Quant au marché chinois, après qu'un grand nombre d'experts ont craqué Windows, ils ont également copié ce fichier sans arrêt avant de l'installer dans nos ordinateurs同样还是拿手机来说事儿,这次我们是根据不同的运营商需要去开发一批定制机,也就是套餐机。这批手机说实话都并没有什么不同,大部分都是相同的配置,但是运营商系统不同,而且偶尔有一些型号的CPU和内存也可能存在不同。这个时候,我们就可以用原型模式来进行快速的复制并且只修改一部分不相同的地方啦。Mobile téléphones, smartphones Il en va de même pour les systèmes d'exploitation et les logiciels de divers produits tels que les équipements. Les copies illimitées après un seul développement sont à l'origine d'énormes profits dans l'industrie du logiciel. Après tout, notre système a été développé par de nombreux ingénieurs travaillant jour et nuit. sur la base du système natif Android, dépêchez-vous et copiez-le sur le téléphone mobile qui est sur le point d'être expédié ! ! 原型模式生产手机类图:
完整源码: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!