php手册之clone
2015-10-23 19:11
483 查看
手册目录: 语言参考---类与对象---clone
参考详情: https://secure.php.net/manual/zh/language.oop5.cloning.php
评论部分:
1. by Hayley Watson
他提到当类内部调用__clone对属性进行同类实例clone时,会造成循环clone,但是实际代码不会这样任由你胡作非为,但是经过本人测试,会造成clone循环调用,如:
输出 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,如下:
3. by walkman@walkman.pk
clone对象的时候,对类属性中非object属性只是执行简单复制,如果要将clone之后的实例属性与本体属性相关联,可以使用&,如下:
4. by olivier
使用clone复制对象的时候,并等同于新建了一个实例,而是开辟一块内存空间给clone过来的对象,所以不会调用__construct方法,如:
值输出一个instance.
5. by cheetah@tanabi.org
如果类中包含object属性,或者array属性,并且array中可能有object,那么使用下面的代码可以对其进行深clone:
参考详情: https://secure.php.net/manual/zh/language.oop5.cloning.php
评论部分:
1. by Hayley Watson
他提到当类内部调用__clone对属性进行同类实例clone时,会造成循环clone,但是实际代码不会这样任由你胡作非为,但是经过本人测试,会造成clone循环调用,如:
<?php class 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) { return (is_object($some)) ? clone $some : $some; }这样当$some是object的时候,执行clone,如果不是,执行普通复制操作.
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方法,如:
<?php class 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吗,之前的文章中有过比较详细的阐述.
如有错误,请及时联系并改正!
相关文章推荐
- 第 三 十 九 天:FTP 的 主 被 动 模 式
- 基础篇(六、七、八) ContentProvider和ContentResolver
- php install error
- PHPStorm调试设置
- PHP 文件处理方法
- 安装php
- yii2 gii Forbidden (#403)解决方案
- php+sqlrelay+mysql实现连接池及读写负载均衡
- PHP开源项目使用Travis CI进行持续集成
- PHP,Mysql-根据一个给定经纬度的点,进行附近地点查询
- php里面的变量从哪里来?
- thinkphp集成nusoap
- excel导入数据的时间格式问题
- php无法连接mysql报错但命令行下可以连接Warning: mysql_connect(): Access denied for
- php,phpexcel插件导出excel使用
- 通过js的console优雅的将php调试信息输出
- 【php】文字转图片
- php 学习笔记--bool
- FreeBSD中配置FTP
- 关于PHPExcel