学习php设计模式 php实现原型模式(prototype)

学习PHP设计模式:PHP实现原型模式(Prototype)

概述

原型模式是一种创建型设计模式,它允许对象通过克隆来创建。这个模式可以被用来使对象的创建更加高效,因为对象的克隆要比新建对象更加快速。

示例

我们假设有一个用户类,其中包含了用户的姓名、电子邮件和密码。我们可以使用原型模式创建一个用户,然后通过在需要时复制此原型来创建新用户对象。

class User
{
    public $name;
    public $email;
    public $password;

    public function __construct($name, $email, $password)
    {
        $this->name = $name;
        $this->email = $email;
        $this->password = $password;
    }

    public function __clone()
    {
        $this->name .= ' (cloned)';
    }
}

在这个示例中,我们定义了一个User类,并在其中添加了一个__clone()方法,当对象被克隆时,该方法会被调用。在本例中,我们将克隆对象的name属性添加“(cloned)”后缀。

现在我们可以通过对原型对象调用PHP的clone关键字来创建新对象。

$userPrototype = new User('John Doe', 'john.doe@example.com', 's3cr3tp@ssw0rd');

$user1 = clone $userPrototype;
echo $user1->name; // 'John Doe (cloned)'

$user2 = clone $userPrototype;
echo $user2->name; // 'John Doe (cloned)'

在上面的示例中,我们使用原型模式创建了两个User对象,通过对$userPrototype对象调用clone来复制对象属性,然后再创建两个新的对象$user1和$user2。

另一个示例

下面是一个更复杂的示例,其中我们使用PHP原型模式创建了一个披萨(Pizza)对象。除了名称(name)和价格(price)以外,披萨对象还有一组配料(toppings)。

class PizzaPrototype
{
    private $name;
    private $price;
    private $toppings = [];

    public function __construct($name, $price, $toppings)
    {
        $this->name = $name;
        $this->price = $price;
        $this->toppings = $toppings;
    }

    public function __clone()
    {
        $this->name .= ' (cloned)';
        $this->toppings = array_map(function($topping) {
            return clone $topping;
        }, $this->toppings);
    }

    public function addTopping($topping)
    {
        $this->toppings[] = $topping;
    }

    public function getName()
    {
        return $this->name;
    }

    public function getPrice()
    {
        return $this->price;
    }

    public function getToppings()
    {
        return $this->toppings;
    }
}

class PizzaToppingPrototype
{
    private $name;

    public function __construct($name)
    {
        $this->name = $name;
    }

    public function getName()
    {
        return $this->name;
    }

    public function __clone()
    {
        $this->name .= ' (cloned)';
    }
}

在上面的示例中,我们定义了两个类:PizzaPrototype和PizzaToppingPrototype。PizzaPrototype类表示一种披萨,它包含名称(name)、价格(price)和配料(toppings)。我们还定义了一个PizzaToppingPrototype类,它表示披萨的一种配料。

当我们将PizzaPrototype实例对象克隆时,__clone()方法会被调用。在__clone()中,我们将name属性添加“(cloned)”后缀并进行递归克隆配料的实例对象。

下面是我们使用PizzaPrototype类的代码:

$topping1 = new PizzaToppingPrototype('Mushrooms');
$topping2 = new PizzaToppingPrototype('Pepperoni');
$topping3 = new PizzaToppingPrototype('Olives');
$topping4 = new PizzaToppingPrototype('Onions');

$pizzaPrototype = new PizzaPrototype('Margherita', 10.99, [$topping1, $topping3]);
$pizzaPrototype->addTopping($topping2);

$pizza1 = clone $pizzaPrototype;
$pizza2 = clone $pizzaPrototype;

$pizza2->addTopping($topping4);

echo 'Pizza 1: ' . $pizza1->getName() . ' - $' . $pizza1->getPrice() . "\n";
foreach ($pizza1->getToppings() as $topping) {
    echo '  ' . $topping->getName() . "\n";
}

echo 'Pizza 2: ' . $pizza2->getName() . ' - $' . $pizza2->getPrice() . "\n";
foreach ($pizza2->getToppings() as $topping) {
    echo '  ' . $topping->getName() . "\n";
}

在这个示例中,我们首先创建几个PizzaToppingPrototype的实例对象作为配料,然后使用它们创建一个PizzaPrototype实例对象。我们克隆$pizzaPrototype二次来创建$pizza1和$pizza2变量,第二个$pizza2上添加了一个新的配料(topping4)。

最后,我们遍历$pizza1和$pizza2的配料并输出。

结论

原型模式是一种非常有用的设计模式,它可以使对象的复制工作更加高效和简便。在PHP中实现原型模式很容易,只需要在类上定义一个__clone()方法即可。在创建对象时,我们可以使用PHP的clone关键字并复制对象的属性。我们在上面的示例中展示了如何使用PHP实现原型模式,并且证明了这一点非常有用和方便。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:学习php设计模式 php实现原型模式(prototype) - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • PHP 网络开发详解之远程文件包含漏洞

    PHP 网络开发详解之远程文件包含漏洞 远程文件包含(RFI)属于一种常见的漏洞类型,攻击者通过该漏洞可以执行任意代码,甚至获取控制权。以下将详细讲解如何利用RFI漏洞实现攻击,并给出两个实例: 概述 远程文件包含漏洞是指攻击者通过指定一段远程URL链接的方式,使服务器端动态脚本在执行时将含有攻击代码的远程文件包含进来,进而实现在服务器上执行恶意代码的行为。…

    PHP 2023年5月26日
    00
  • php中try catch捕获异常实例详解

    PHP中try catch捕获异常实例详解 在PHP中,异常是表示错误或异常情况的对象。当程序运行发生了一些错误或异常情况时,我们可以通过抛出异常的方式来停止程序的执行,并且还可以根据需要抛出自定义异常。try catch是一种机制,用于捕获和处理代码块中发生的异常。本文将详细讲解PHP中try catch捕获异常的具体使用方法,并且提供相关的示例说明。 基…

    PHP 2023年5月26日
    00
  • php缓冲输出实例分析

    首先我们需要了解什么是缓冲输出。简而言之,缓冲输出是指先将输出的内容保存在缓存中,等到一定的条件满足后再进行输出。 在PHP中,我们可以使用 ob_start() 函数来开启缓冲区。一旦开启缓冲区,所有的输出内容都将保存在缓冲区中。我们可以使用 ob_get_contents() 函数来获取缓冲区中的内容,使用 ob_clean() 函数来清空缓冲区,使用 …

    PHP 2023年5月26日
    00
  • php 获取全局变量的代码

    获取 PHP 全局变量是 PHP 开发中一个非常基本且常见的操作。在 PHP 中,PHP 全局变量是指在所有作用域中都可以访问的变量,可以在脚本的任何地方访问它们。 以下是获取 PHP 全局变量的代码示例: 示例 1 有一个 PHP 全局变量 $GLOBALS,在任何 PHP 脚本文件中都可以直接访问它。使用 $GLOBALS 可以获取到 PHP 脚本中定义…

    PHP 2023年5月23日
    00
  • php删除数组中重复元素的方法

    当我们使用 PHP 数组时,经常需要删除其中的重复元素。下面是一些常用的方法: 方法一:使用 array_unique 函数 $array = array("a", "b", "a", "c"); $array = array_unique($array); print_r($a…

    PHP 2023年5月26日
    00
  • php简单截取字符串代码示例

    首先,需要明确什么是字符串截取。字符串截取指的是从一个字符串中选取一部分,生成一个新的字符串。在PHP中,可以通过substr函数实现字符串截取。 substr函数的基本用法如下: substr(string $string, int $start, int|null $length = null): string|false 其中,$string参数是要进…

    PHP 2023年5月23日
    00
  • PHP编程快速实现数组去重的方法详解

    针对“PHP编程快速实现数组去重的方法详解”的问题,我来给您详细讲解。 1. 什么是数组去重 数组去重是指在一个数组中,将重复的元素删除,只保留一个元素的操作过程。具体来说,就是将数组中重复出现的元素保留一个即可。 2. 方法详解 2.1使用array_unique函数 在PHP中,使用array_unique()函数可以快速实现数组去重。array_uni…

    PHP 2023年5月26日
    00
  • php 实现收藏功能的示例代码

    要实现网站的收藏功能,需要前端和后端的配合。前端需要设置一个“收藏”按钮,用户点击后将文章ID发送到后端,后端接收并处理,将用户ID和文章ID存入数据库中。下面是实现收藏功能的示例代码: 前端代码 <button data-id="123" class="btn-favorites">收藏</butt…

    PHP 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部