设计模式之原型模式(php实现)
2024-09-02 13:42:27
github地址:https://github.com/ZQCard/design_pattern
1.先了解什么是浅拷贝与深拷贝
//深拷贝:赋值时值完全复制,完全的copy,对其中一个作出改变,不会影响另一个
//
//浅拷贝:赋值时,引用赋值,相当于取了一个别名。对其中一个修改,会影响另一个 对象作为参数传递时,也是引用传递
//php 对象复制,是复制对象的引用地址,因此使用 $objA = $objB 这种写法时,$objA与$objB会指向相同的内存地址。当$objA 发生变化时,$objB也会受到影响。
//如果我们要$objA对象复制为$objB对象,复制之后,$objA有什么变化,都不会影响$objB。即$objA与$objB是两个独立的对象,但$objB的初始值是由$objA创建的,比较高效的做法是使用clone()方法。
//$objB = clone $objA;
//$objB的值是在$objA基础加$objA事例对象里clone()方法改变后的实例。
//当对象被复制后,所有的属性中的引用保持不变,指向原来的变量 ******
class Demo
{
public $string;
}
//$a = new Demo();
//$a->string = 1;
//$b = clone $a; // 在堆复制一个一摸一样的 其实是两个对象 但是同时指向的$string的地址是不变的
//var_dump($a); // true
//var_dump($b); // false
//var_dump($b == $a); // true
//var_dump($b === $a); // false
(1)Prototype.class.php(规范子类接口)
<?php namespace Prototype; interface Prototype
{
public function copy();
public function deepCopy();
}
(2)ConcretePrototype.class.php (具体原型)
<?php
namespace Prototype; class ConcretePrototype implements Prototype{ private $_obj; public function __construct($obj)
{
$this->_obj = $obj;
} public function getObj()
{
return $this->_obj;
} public function setObj($obj)
{
$this->_obj = $obj;
} public function copy()
{
return clone $this;
} public function deepCopy()
{
$object = serialize($this);
$cloneObject = unserialize($object);
return clone $cloneObject;
} }
(3)prototype.php(客户端)
<?php spl_autoload_register(function ($classObj){
$classObj = str_replace('\\','/',$classObj);
include $classObj.".class.php";
}); class Demo
{
public $string;
}
//深拷贝:赋值时值完全复制,完全的copy,对其中一个作出改变,不会影响另一个
//
//浅拷贝:赋值时,引用赋值,相当于取了一个别名。对其中一个修改,会影响另一个 对象作为参数传递时,也是引用传递
//php 对象复制,是复制对象的引用地址,因此使用 $objA = $objB 这种写法时,$objA与$objB会指向相同的内存地址。当$objA 发生变化时,$objB也会受到影响。
//如果我们要$objA对象复制为$objB对象,复制之后,$objA有什么变化,都不会影响$objB。即$objA与$objB是两个独立的对象,但$objB的初始值是由$objA创建的,比较高效的做法是使用clone()方法。
//$objB = clone $objA;
//$objB的值是在$objA基础加$objA事例对象里clone()方法改变后的实例。
//当对象被复制后,所有的属性中的引用保持不变,指向原来的变量
//$a = new Demo();
//$a->string = 1;
//$b = clone $a; // 在堆复制一个一摸一样的 其实是两个对象 但是同时指向的$string的地址是不变的
//var_dump($a); // true
//var_dump($b); // false
//var_dump($b == $a); // true
//var_dump($b === $a); // false use Prototype\ConcretePrototype; // 浅拷贝
$demo = new Demo();
$demo->string = 'card';
$object_first = new ConcretePrototype($demo);
$object_second = $object_first->copy();
echo '<pre/>';
var_dump($object_first->getObj() == $object_second->getObj()); // true
var_dump($object_first->getObj() === $object_second->getObj());// true // 深拷贝
$demo = new Demo();
$demo->string = 'card';
$object_first = new ConcretePrototype($demo);
$object_second = $object_first->deepCopy();
echo '<pre/>';
var_dump($object_first);
var_dump($object_second);
var_dump($object_first->getObj() == $object_second->getObj()); // true
var_dump($object_first->getObj() === $object_second->getObj());// false
最新文章
- TSQL语句练习题
- VS2013 配置pthread
- 编写第一个MapReduce程序—— 统计气温
- JavaScript 经典实例收集整理
- 给RecyclerView实现的GridView加上HeaderView和FooterView
- postfix config
- ABAP--如何在ALV_Grid的函数中定义下拉列表
- Day One
- CSS如何实现数字分页效果
- angular : direative :comunication 指令之间的通讯
- 使用JSONObject生成和解析json
- Python并发实践_02_通过yield实现协程
- 【转】新手该如何学python怎么学好python?
- [SHOI2006]color 有色图[群论、组合计数]
- LoadRunner录制协议的选择
- Apache+Tomcat+mod_jk配置教程
- C#:VS2010 由于缺少调试目标";xx.exe";,Visual Studio无法开始调试,请生成项目并重试,或者相应地设置OutputPath和AssemblyName属性,使其指向目标程序集的正确位置
- [转]Bootstrap table 分页 In asp.net MVC
- 洛咕 P3700 [CQOI2017]小Q的表格
- 【转】标准C++类std::string的内存共享和Copy-On-Write技术