PHP原型模式

作者: 三月孙记风 | 来源:发表于2018-09-23 18:29 被阅读49次
<?php
/*抽象原型类*/
abstract class Prototype {
    abstract function __clone();
}

class Map extends Prototype {
    public $width;
    public $height;
    public $sea;

    public function __conturct() {
        echo '我初始化了';
    }

    public function setAttribute(array $conllection) {
        foreach ($conllection as $key => $val) {
            $this->$key = $val;
        }
    }

    /*浅拷贝*/
    public function __clone() {}
    /*深度拷贝*/
    // public function __clone() {
    //  $this->sea = clone $this->sea;
    // }
    /**
     *推荐的深度拷贝
     * serialize() 返回字符串,此字符串包含了表示 value 的字节流,可以存储于任何地方。
     * 这有利于存储或传递 PHP 的值,同时不丢失其类型和结构。
     * unserialize() 对单一的已序列化的变量进行操作,将其转换回 PHP 的值。
     * */
    // public function __clone() {
    //  $serialize_obj = serialize($this->sea); //序列化
    //  $this->sea = unserialize($serialize_obj); //反序列化
    // }

}

class Sea {
    // public $fish;

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


$map_protype = new Map();
$sttributes = array('width' => 40, 'height' => 60, 'sea' => (new Sea()));
$map_protype->setAttribute($sttributes);
$new_map = clone $map_protype;
var_dump($map_protype);
echo '<br>';
var_dump($new_map);

echo '<br>';
echo '<br>';
echo '<br>';
$new_map->width = 80;
var_dump($map_protype);
echo '<br>';
var_dump($new_map);

/*但是上面的代码还是存在一些问题。那就是它只是一个浅拷贝,
什么意思呢?map原型对象有一个属性sea存放了一个sea对象,
在调用setAttribute的时候,对象的赋值方式默认是引用。而当
我们克隆map对象时,直接克隆了map的sea属性,这就使得克
隆出来的对象与原型对象的sea属性对指向了,同一个sea对象
的内存空间。如果这个时候,我们改变了克隆对象的sea属性,
那么原型对象的sea属性也跟着改变*/
echo '<br>';
echo '<br>';
echo '<br>';
$new_map->sea->d = 80;
var_dump($map_protype);
echo '<br>';
var_dump($new_map);

$map_protype = new Map();
$sttributes = array('width' => 40, 'height' => 60, 'sea' => (new Sea('鱼')));
$map_protype->setAttribute($sttributes);
$new_map = clone $map_protype;
var_dump($map_protype);
var_dump($new_map);

$map_protype->sea->fish = "大鱼";
var_dump($map_protype);
echo '</br>';
var_dump($new_map);

相关文章

  • PHP 完整实战23种设计模式

    PHP实战创建型模式 单例模式 工厂模式 抽象工厂模式 原型模式 建造者模式 PHP实战结构型模式 桥接模式 享元...

  • PHP设计模式(六)-原型模式

    layout: posttitle: "PHP设计模式(六)-原型模式"date: 2016-06-07 10:2...

  • PHP原型模式

  • PHP 原型模式

    原型模式与工厂模式作用类似,都是用来创建对象,但不同的是原型模式是先创建好一个原型对象,然后通过clone原型对象...

  • php原型模式

    1.原型模式简介    原型模式的核心思想是,通过拷贝指定的“原型实例(对象)”,创建跟该对象一样的新对象。简单理...

  • PHP完整实战23种设计模式

    前言 设计模式是面向对象的最佳实践 实战 PHP实战创建型模式 单例模式 工厂模式 抽象工厂模式 原型模式 建造者...

  • PHP 设计模式---原型模式

    原型模式(Prototype Pattern):与工厂模式类似,都是用来创建对象的。利用克隆来生成一个大对象,减少...

  • php设计模式——原型模式

    原型模式 概念理解:原型模式是先创建好一个原型对象,然后通过clone原型对象来创建新的对象。适用于大对象的创建,...

  • PHP设计模式:原型模式

    前言 原型模式用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价...

  • PHP设计模式-原型模式

    适用性 原型设计模式创建对象的方式是复制和克隆初始对象或原型,这种方式比创建新实例更为有效。 UML MyOjec...

网友评论

本文标题:PHP原型模式

本文链接:https://www.haomeiwen.com/subject/undqoftx.html