php手册之clone
来源:互联网 发布:豪世华邦新员工端口费 编辑:程序博客网 时间:2024/04/29 01:01
手册目录: 语言参考---类与对象---clone
参考详情: https://secure.php.net/manual/zh/language.oop5.cloning.php
评论部分:
1. by Hayley Watson
他提到当类内部调用__clone对属性进行同类实例clone时,会造成循环clone,但是实际代码不会这样任由你胡作非为,但是经过本人测试,会造成clone循环调用,如:
<?phpclass Foo{ var $that; function __clone() { $this->that = clone $this->that; }}$a = new Foo;$b = new Foo;$a->that = $b;$b->that = $a;$c = clone $a;echo 'What happened?';var_dump($c);?>输出 Fatal error: Maximum function nesting level of '100' reached, aborting!
因为php.ini里面有设置递归层数,所以当循环clone到这个层数的时候,就会error,如果允许无限循环,那么它会吃空内存,知道没有资源可用为止.
2. by Alexey
clone只适用于object,如果你这样写;
$a = 'a';
$b = clone $a;
将会报错,Alexey提出一种办法,不用考虑clone的对象是否是object,如下:
function clone_($some)
这样当$some是object的时候,执行clone,如果不是,执行普通复制操作.
{
return (is_object($some)) ? clone $some : $some;
}
3. by walkman@walkman.pk
clone对象的时候,对类属性中非object属性只是执行简单复制,如果要将clone之后的实例属性与本体属性相关联,可以使用&,如下:
<?php
class A
{
public $name ;
public function __construct()
{
$this->name= & $this->name;
}
}
$a = new A;
$a->name= "George";
$b = clone $a;
$b->name= "Somebody else";
var_dump($a);
var_dump($b);
?>
this will output:
object(A)#1 (1) {
["name"]=>
&string(13) "Somebody else"
}
object(A)#2 (1) {
["name"]=>
&string(13) "Somebody else"
}
4. by olivier
使用clone复制对象的时候,并等同于新建了一个实例,而是开辟一块内存空间给clone过来的对象,所以不会调用__construct方法,如:
<?phpclass Foo{ function __construct() { echo 'instance'; }}$a = new Foo();$b = clone $a;?>值输出一个instance.
5. by cheetah@tanabi.org
如果类中包含object属性,或者array属性,并且array中可能有object,那么使用下面的代码可以对其进行深clone:
<?php
function __clone() {
foreach($this as $key => $val) {
if(is_object($val)||(is_array($val))){
$this->{$key} =unserialize(serialize($val));
}
}
}
?>
还记得unserialize和serialize吗,之前的文章中有过比较详细的阐述.
如有错误,请及时联系并改正!
- php手册之clone
- PHP之克隆clone
- php手册之static
- php手册之Trait
- php手册之变量范围
- php手册之可变变量
- php手册之匿名函数
- php手册之抽象类
- PHP 进阶之研读 PHP 手册一
- php之clone 复制对象以及__clone魔术方法
- php手册之Callback 回调类型
- php手册之类型转换的判别
- php手册之自动加载类
- php 5 clone __clone()
- Clone in the PHP
- php 对象克隆 clone
- php clone __clone()复制
- PHP克隆对象clone
- Activity
- Linux那些事儿之我是Block层(5)浓缩就是精华?(二) .
- [C++]linux下使用occi连接oracle遇到的两个错误
- 多维分析OLAP引擎Mondrian学习
- oracle定时任务更新数据
- php手册之clone
- IOS 通过POST方式与服务器通信
- 杭电1017--整数问题
- 【IOS 开发学习总结-OC-64】Quartz 2D绘图(4-1)——Quartz 2D绘图基础+点线模式
- 新建表格
- 线程池详解
- eclipse mars对C++11标准的支持
- RC滤波器截止频率在线计算器
- GUI 事件绑定实例