php魔术函数 __clone()
原文地址: http://www.nowamagic.net/librarys/posts/php/32
PHP4面向对象功能一个很大的缺点,是将对象视为另一种数据类型,这使得很多常见的OOP方法无法使用,如设计模式。这些方法依赖于将对象作为引用传递给其他类方法,而不是作为值传递,而按值传递却是PHP的默认做法。幸好,PHP5解决了这个问题,现在所有对象在默认情况下都被视为引用。但是,由于所有对象都被视为引用而不是值,所以现在复制对象更为困难。如果尝试复制一个引用的对象,这只会指向原对象的地址位置。为了解决复制问题,PHP提供了一种克隆(clone)对象的显式方法。
对象克隆 可以在对象前面加clone关键字来克隆对象,如下:
destinationObject = clone targetObject;
下面将给出一个详细的对象克隆示例。
这个例子使用一个名为Corporate_Drone的示例类,它包含两个成员(employeeid和tiecolor),并有相应的获取方法和设置方法。
此代码首先实例化一个corporatedrone对象,并以此为基础展示克隆操作的效果:
<?php
class corporatedrone {
private $employeeid;
private $tiecolor;
// Define a setter and getter for $employeeid
function setEmployeeID($employeeid) {
$this->employeeid = $employeeid;
}
function getEmployeeID() {
return $this->employeeid;
}
// Define a setter and getter for $tiecolor
function setTiecolor($tiecolor) {
$this->tiecolor = $tiecolor;
}
function getTiecolor() {
return $this->tiecolor;
}
}
// Create new corporatedrone object
$drone1 = new corporatedrone(); // Set the $drone1 employeeid member
$drone1->setEmployeeID("12345"); // Set the $drone1 tiecolor member
$drone1->setTiecolor("red"); // Clone the $drone1 object
$drone2 = clone $drone1; // Set the $drone2 employeeid member
$drone2->setEmployeeID("67890"); // Output the $drone1 and $drone2 employeeid members
echo "drone1 employeeID: ".$drone1->getEmployeeID()."<br />";
echo "drone1 tie color: ".$drone1->getTiecolor()."<br />";
echo "drone2 employeeID: ".$drone2->getEmployeeID()."<br />";
echo "drone2 tie color: ".$drone2->getTiecolor()."<br />";
?>
输出结果为:
drone1 employeeID: 12345
drone1 tie color: red
drone2 employeeID: 67890
drone2 tie color: red
$drone2变成一个Corporate_Drone类型的对象,并继承了$drone1的成员值。为进一步展示$drone2确实是Comporate_Drone类型,这里还重新对employeeid成员进行了赋值
__clone()方法
可以在对象类中定义一个__clone()方法来调整对象的克隆行为。此方法的代码将在克隆操作期间执行。除了将所有现有对象成员复制到目标对象之外,还会执行__clone()方法指定的操作。下面修改Corporate_Drone类,增加以下方法:
function __clone() {
$this->tiecolor = "blue";
}
之后,创建一个新的Corporate_Drone对象,增加employeeid成员的值,克隆这个对象,然后输出一些数据,从而显示克隆对象的tiecolor确实是通过__clone()方法设置的。
示例代码:
<?php
// Create new corporatedrone object
$drone1 = new corporatedrone(); // Set the $drone1 employeeid member
$drone1->setEmployeeID("12345"); // Clone the $drone1 object
$drone2 = clone $drone1; // Set the $drone2 employeeid member
$drone2->setEmployeeID("67890"); // Output the $drone1 and $drone2 employeeid members
echo "drone1 employeeID: ".$drone1->getEmployeeID()."<br />";
echo "drone2 employeeID: ".$drone2->getEmployeeID()."<br />";
echo "drone2 tiecolor: ".$drone2->getTiecolor()."<br />";
?>
输出结果为:
drone1 employeeID: 12345
drone2 employeeID: 67890
drone2 tiecolor:
将一个类赋值给另一个类,此时内存中仍是一个对象:
<?php
class Fruit {
private $name = "水果";
private $color = "颜色"; public function setName($name){
$this->name = $name;
} public function setColor($color){
$this->color = $color;
} function showColor(){
return $this->color.'的'.$this->name."<br />";
} function __destruct(){
echo "被吃掉了(对象被回收) <br />";
}
} $apple = new Fruit();
$apple->setName("大苹果");
$apple->setColor("红色");
echo $apple->showColor(); $clone_apple = $apple;
$clone_apple->setName("小苹果");
$clone_apple->setColor("青色"); echo $clone_apple->showColor();
?>
输出结果为:
红色的大苹果
青色的小苹果
被吃掉了(对象被回收)
clone方法克隆出了一个新的类,此时内存中有两个对象:
<?php
class Fruit {
private $name = "水果";
private $color = "颜色"; public function setName($name){
$this->name = $name;
} public function setColor($color){
$this->color = $color;
} function showColor(){
return $this->color.'的'.$this->name."<br />";
} function __destruct(){
echo "被吃掉了(对象被回收) <br />";
}
function __clone(){
$this->name = "克隆水果";
}
} $apple = new Fruit();
$apple->setName("大苹果");
$apple->setColor("红色");
echo $apple->showColor();
echo "<hr/>";
$clone_apple = clone $apple;
$clone_apple->setColor("青色"); echo $clone_apple->showColor();
?>
输出结果为:
红色的大苹果
青色的克隆水果
被吃掉了(对象被回收)
被吃掉了(对象被回收)
php魔术函数 __clone()的更多相关文章
- PHP5中常用的魔术函数有哪些,举例说明各自的用法。
所谓魔术函数,是指不同时刻为了完成特定的功能,而自动调用的方法. __sleep 在serialize()序列化对象之前会调用这个函数__wakeup 在unserialize()解 ...
- php5魔术函数、魔术常量
魔术函数 1.__construct() 实例化对象时被调用, 当__construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用. 2.__destruct ...
- PHP 魔术变量和魔术函数详解
魔术变量 PHP 向它运行的任何脚本提供了大量的预定义常量. 不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了. 有八个魔术常量它们的 ...
- PHP超级全局变量、魔术变量和魔术函数
PHP超级全局变量(9个) $GLOBALS 储存全局作用域中的变量 $_SERVER 获取服务器相关信息 $_REQUEST 获取POST和GET请求的参数 $_POST 获取表单的POST请求参数 ...
- php魔术变量和13个PHP魔术函数
PHP魔术变量确切地说是PHP魔术常量,不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了.比如说__LINE__放在不同的地方是显示不 ...
- PHP超级全局变量、魔术变量和魔术函数的区别和联系
PHP超级全局变量.魔术变量和魔术函数的区别和联系 一.总结 一句话总结:PHP超级全局变量主要用于web开发,魔术变量主要用于输出当前对象的信息,魔术函数则是对象的常用方法 相同点: 1.PHP超级 ...
- Atitit.跨平台预定义函数 魔术方法 魔术函数 钩子函数 api兼容性草案 v2 q216 java c# php js.docx
Atitit.跨平台预定义函数 魔术方法 魔术函数 钩子函数 api兼容性草案 v2 q216 java c# php js.docx 1.1. 预定义函数 魔术方法 魔术函数是什么1 1.2. & ...
- PHP魔术函数、魔术常量、预定义常量
一.魔术函数(13个) 1.__construct() 实例化对象时被调用, 当__construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用. 2.__des ...
- 详解PHP魔术函数、魔术常量、预定义常量
一.魔术函数(13个) 1.__construct() 实例化对象时被调用, 当__construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用. 2.__des ...
随机推荐
- SSH框架面试题集锦
Hibernate工作原理及为什么要使用Hibernate? 工作原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Session 4.创建事务Tran ...
- Spring Cloud与微服务构建:微服务简介
Spring Cloud与微服务构建:微服务简介 单体架构及其不足 1.单体架构简介 在软件设计中,经常提及和使用经典的3曾模型,即表示层.业务逻辑层和数据访问层. 表示层:用于直接和用户交互,也成为 ...
- 聊聊flink的NetworkEnvironmentConfiguration
本文主要研究一下flink的NetworkEnvironmentConfiguration NetworkEnvironmentConfiguration flink-1.7.2/flink-runt ...
- 【BZOJ2989】数列(二进制分组,主席树)
[BZOJ2989]数列(二进制分组,主席树) 题面 BZOJ 权限题啊... Description 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即g ...
- WEB入门.七 CSS布局模型
学习内容 标准文档流 流动模型(flow model) 浮动模型(float model) CSS基本布局 能力目标 理解标准文档流 使用流动模型实现页面布局 使用浮动模型实现页面布局 掌握常用CSS ...
- HYSBZ(BZOJ) 4300 绝世好题(位运算,递推)
HYSBZ(BZOJ) 4300 绝世好题(位运算,递推) Description 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<= ...
- [JSOI2009] 球队收益 (费用流)
终于来发题解啦! pdf版题解 #include<iostream> #include<cstring> #include<cstdio> #include< ...
- 【bzoj2741】[FOTILE模拟赛] L
Portal --> bzoj2741 Solution 突然沉迷分块不能自拔 考虑用分块+可持久化trie来解决这个问题 对于每一块的块头\(L\),预处理\([L,i]\)区间内的所有子区间 ...
- .NET MVC 获取 当前请求的 控制器/视图/区域 的名字
.NET MVC 在action中或过滤器中或视图中,分别如何获取 当前请求的 控制器/视图/区域 的名字 1)过滤器中的: public class CMSAttribute : Filter ...
- 18华南理工校赛 K 小马哥的超级盐水
https://www.nowcoder.com/acm/contest/94/K sum(ai)/sum(bi) = x/y <=> sum(ai*yi-bi*x) = 0 跟这题有点类 ...