PHP中如何实现原型模式以复用对象结构?

2026-04-05 15:591阅读0评论SEO资讯
  • 内容介绍
  • 相关推荐

本文共计1117个文字,预计阅读时间需要5分钟。

PHP中如何实现原型模式以复用对象结构?

在之前的文章《浅析PHP中的迭代器模式》中,我们介绍了PHP中的迭代器模式。下文章节深入讲解了PHP中的原型模式。原型模式实际上是更形象地称谓为克隆模式。其主要行为是复制一个已经存在的对象,生成一个新对象。

克隆模式主要行为是复制一个已经存在的对象,生成一个新对象。

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

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

Gof类图及解释

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()方法。后面我们看具体的例子时再说明。

PHP中如何实现原型模式以复用对象结构?

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属性。

  • 原型模式看似就是复制了一个相同的对象,但是请注意,复制的时候,__construct()方法并没有被调用,也就是当你运行这段代码的时候,create只输出了一次。这也就带出了原型模式最大的一个特点——减少创建对象时的开销
  • 基于上述特点,我们可以快速的复制大量相同的对象,比如要给一个数组中塞入大量相同的对象时。
  • 复制出来的对象中如果都是值类型的属性,我们可以任意修改,不会对原型产生影响。而如果有引用类型的变量,则需要在__clone()方法进行一些处理,否则修改了复制对象的引用变量中的内容,会对原型对象中的内容有影响。

我们的手机操作系统(也可以想象一下PC电脑的操作系统),都是怎样安装到设备中呢?其实都是不停的复制拷贝最初的那一套系统。用微软的例子非常好说明这个问题,当年微软能够成为一个帝国,其实也是因为他不停的将winodws操作系统拷贝复制到光盘中,然后卖给千家万户(当然,这里没中国什么事儿)。而中国市场呢,大量的高手破解了windows之后也是由这一份文件不停的复制拷贝才装到了我们的电脑中。手机、智能设备等各类产品的操作系统、软件都是如此。一次开发无限拷贝正是软件行业暴利的原因。毕竟我们的系统也是由不少的工程师日以继夜的996在Android原生系统的基础上开发出来的,赶紧不断的复制到即将出厂的手机上吧!!

完整代码:link.juejin.cn/?target=link.juejin.cn/?target=juejin.cn/post/6844903942220939272

作者:硬核项目经理

本文共计1117个文字,预计阅读时间需要5分钟。

PHP中如何实现原型模式以复用对象结构?

在之前的文章《浅析PHP中的迭代器模式》中,我们介绍了PHP中的迭代器模式。下文章节深入讲解了PHP中的原型模式。原型模式实际上是更形象地称谓为克隆模式。其主要行为是复制一个已经存在的对象,生成一个新对象。

克隆模式主要行为是复制一个已经存在的对象,生成一个新对象。

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

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

Gof类图及解释

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()方法。后面我们看具体的例子时再说明。

PHP中如何实现原型模式以复用对象结构?

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属性。

  • 原型模式看似就是复制了一个相同的对象,但是请注意,复制的时候,__construct()方法并没有被调用,也就是当你运行这段代码的时候,create只输出了一次。这也就带出了原型模式最大的一个特点——减少创建对象时的开销
  • 基于上述特点,我们可以快速的复制大量相同的对象,比如要给一个数组中塞入大量相同的对象时。
  • 复制出来的对象中如果都是值类型的属性,我们可以任意修改,不会对原型产生影响。而如果有引用类型的变量,则需要在__clone()方法进行一些处理,否则修改了复制对象的引用变量中的内容,会对原型对象中的内容有影响。

我们的手机操作系统(也可以想象一下PC电脑的操作系统),都是怎样安装到设备中呢?其实都是不停的复制拷贝最初的那一套系统。用微软的例子非常好说明这个问题,当年微软能够成为一个帝国,其实也是因为他不停的将winodws操作系统拷贝复制到光盘中,然后卖给千家万户(当然,这里没中国什么事儿)。而中国市场呢,大量的高手破解了windows之后也是由这一份文件不停的复制拷贝才装到了我们的电脑中。手机、智能设备等各类产品的操作系统、软件都是如此。一次开发无限拷贝正是软件行业暴利的原因。毕竟我们的系统也是由不少的工程师日以继夜的996在Android原生系统的基础上开发出来的,赶紧不断的复制到即将出厂的手机上吧!!

完整代码:link.juejin.cn/?target=link.juejin.cn/?target=juejin.cn/post/6844903942220939272

作者:硬核项目经理