Maison  >  Article  >  développement back-end  >  Découvrez le modèle de prototype en PHP dans un article

Découvrez le modèle de prototype en PHP dans un article

青灯夜游
青灯夜游avant
2021-07-07 19:22:582963parcourir

在之前的文章《浅谈PHP中的迭代器模式》中我们介绍了PHP中的迭代器模式,下面本篇文章带大家了解一下PHP中的原型模式。

Découvrez le modèle de prototype en PHP dans un article

原型模式其实更形象的来说应该叫克隆模式。它主要的行为是对对象进行克隆,但是又把被克隆的对象称之为最初的原型,于是,这个模式就这样被命名了。说真的,从使用方式来看真的感觉叫克隆模式更贴切一些。

Gof类图及解释

GoF定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象

GoF类图:

Mode prototype

代码实现:

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来复制Découvrez le modèle de prototype en PHP dans un articlep2也具有相同的$v属性。

  • 原型模式看似就是复制了一个相同的对象,但是请注意,复制的时候,__construct()方法并没有被调用,也就是当你运行这段代码的时候,create只输出了一次。这也就带出了原型模式最大的一个特点——减少创建对象时的开销
  • Sur la base des caractéristiques ci-dessus, nous pouvons rapidement copier un grand nombre des mêmes objets, par exemple, pour donner un Lorsqu'un grand nombre d'objets identiques sont insérés dans le tableau基于上述特点,我们可以快速的复制大量相同的对象,比如要给一个数组中塞入大量相同的对象时。
  • Si les objets copiés sont tous des attributs de type valeur, nous pouvons les modifier arbitrairement sans affecter le prototype复制出来的对象中如果都是值类型的属性,我们可以任意修改,不会对原型产生影响。而如果有引用类型的变量,则需要在__clone()方法进行一些处理,否则修改了复制对象的引用变量中的内容,会对原型对象中的内容有影响。Et s'il y a variables de type référence, vous devez effectuer quelques traitements dans la méthode __clone(), sinon la modification du contenu dans la variable de référence de l'objet copié affectera le contenu de l'objet prototype我们的手机操作系统(也可以想象一下PC电脑的操作系统),都是怎样安装到设备中呢?其实都是不停的复制拷贝最初的那一套系统。用微软的例子非常好说明这个问题,当年微软能够成为一个帝国,其实也是因为他不停的将winodws操作系统拷贝复制到光盘中,然后卖给千家万户(当然,这里没中国什么事儿)。而中国市场呢,大量的高手破解了windows之后也是由这一份文件不停的复制拷贝才装到了我们的电脑中。手机、智能设备等各类产品的操作系统、软件都是如此。一次开发无限拷贝正是软件行业暴利的原因。毕竟我们的系统也是由不少的工程师日以继夜的996在Android原生系统的基础上开发出来的,赶紧不断的复制到即将出厂的手机上吧!!

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
L'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 = &#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();

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中的是同一个对象。没错,这就是引用的复制问题。引用只是复制了引用的地址,他们指向的是同一个对象。当

🎜

Découvrez le modèle de prototype en PHP dans un article

🎜🎜

🎜

  • 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 Découvrez le modèle de prototype en PHP dans un articlecmPhone. 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.

  • La chose la plus importante en mode prototype est de faire attention aux deux points ci-dessus, tandis que les attributs de valeur ordinaires seront copiés directement et ce problème ne se produira pas. Deux autres concepts sont impliqués ici : Copie superficielle et Copie profonde
  • Copie superficielle signifie que toutes les variables de l'objet copié contiennent les mêmes valeurs que l'objet d'origine, et que toutes les références à d'autres objets restent Pointer vers l'objet original
  • La copie approfondie pointe la variable de l'objet de référence vers le nouvel objet copié au lieu de l'objet référencé d'origine
  • Nous expliquerons les problèmes de références et de valeurs dans d'autres articles, veuillez faire attention au compte WeChat ou Nuggets

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer