php __clone需要注意的问题
当一个对象的属性是另外一个对象时,当有一个对象复制该对象时,当复制到这个属性(一个对象)时,只复制这个属性(对象)的引用,而不复制引用的对象。
class Account{
public $balance;
function __construct($balance){
$this->balance=$balance;
}
}
class Person{
private $name;
private $age;
private $id;
public $account;
function __construct($name,$age,$account){
$this->name=$name;
$this->age=$age;
$this->account=$account;
}
function setId($id){
$this->id=$id;
}
function __clone(){
$this->id=0;
}
}
$p1=new Person('tom', 33, new Account(200));
$p1->setId(4);
$p2=clone $p1;
//给$p1充500
$p1->account->balance+=500;
//结果$p2也得到了这笔钱
print $p2->account->balance; //
当创建一个新副本($p2)时,新对象($p2)的中所保存的引用指向的是$p1所引用的同一个$account对象.
如果不想对象属性在被复制之后被共享,可以显式地在__clone方法中复制指向的对象
function __clone(){
$this->id=0;
$this->account=clone $this->account;
}
php __clone需要注意的问题的更多相关文章
- __clone()方法和传址区别
示例: <?php class Computer{ public $name = '联想'; public function _run(){ return '运行中'; } } $comp1 = ...
- 【PHP面向对象(OOP)编程入门教程】17.克隆对象__clone()方法
有的时候我们需要在一个项目里面,使用两个或多个一样的对象,如果你使用“new”关键字重新创建对象的话,再赋值上相同的属性,这样做比较烦琐而且也容易出错,所以要根据一个对象完全克隆出一个一模一样的对象, ...
- PHP中的魔术方法:__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone and __autoload
1.__get.__set 这两个方法是为在类和他们的父类中没有声明的属性而设计的: __get( $property ) 当调用一个未定义的属性时访问此方法: __set( $property, $ ...
- php的__clone __call
(1) __clone方法在一个对象赋值给另外的一个对象的时候自动调用 <?php class A { public $a = "aa"; public $b = 10; f ...
- PHP 魔术方法 __clone __toString(五)
__clone() - 当对象克隆的时候自动加载此方法 __toString() - 当对象需要echo打印输出的时候自动加载此方法 __clone() <?php class example{ ...
- Object之克隆对象clone 和__clone()函数
在前面的PHP面向对象之对象和引用,"$b=$a"的方式复制对象传递的是对象的地址,而不是传递对象的值(内容),我们可以通过克隆对象来实现对对象的内容和引用的复制 使用传址引用的方 ...
- PHP面向对象(OOP):克隆对象__clone()方法
有的时候我们需要在一个项目里面,使用两个或多个一样的对象,如果你使用“new”关键字重新创建对象的话,再赋值上相同的属性,这样做比较烦琐而且也容易出错,所以要根据一个对象完全克隆出一个一模一样的对象, ...
- php __clone实现
<?php class Account { public $balance; public function __construct($balance) { $this->balance ...
- PHP5中__call、__get、__set、__clone、__sleep、__wakeup的用法
__construct(),__destruct(),__call(),__callStatic(),__get(),__set(),__isset(),__unset(),__sleep(),__w ...
随机推荐
- [SQL]开启事物,当两条插入语句有出现错误的时候,没有错误的就插入到表中,错误的语句不影响到正确的插入语句
begin transaction mustt insert into student values(,'kkk','j大洒扫','j','djhdjh') insert into student v ...
- ListView的position的保持
需求场景: 一个ListView页面,滑动阅读到某一位置,然后退出页面,下次再进入页面的时候,想要直接滑动到上次阅读的位置. 方案1: 页面退出的时候,ListView.getFirstVisible ...
- 错误记录,找不到sqlite dll
Could not load file or assembly'System.Data.SQLite.dll' or one of its depedencies.找不到指定模块. 在CSDN找到解决 ...
- Android——进度条ProgressBar
1.activity_progressbar.xml <?xml version="1.0" encoding="utf-8"?><Linea ...
- [转]iOS技巧之获取本机通讯录中的内容,解析通讯录源代码
一.在工程中添加AddressBook.framework和AddressBookUI.framework 二.获取通讯录 1.在infterface中定义数组并在init方法中初始化 ? 1 2 3 ...
- python 如何找到某一目录下的文件类型(三种方法)
#!/usr/bin/env python import glob import os os.chdir(“./”) for file in glob.glob(“*.py”): print file ...
- HIVE配置文件
进入HIVE_HOME/conf 编辑文件hive-site.xml,内容如下:(这是伪分布式模式) 主要声明了以下几个内容: 数据仓库地址 数据库连接地址 数据库连接驱动 数据库连接用户名 数据库连 ...
- TortoiseSVN期望文件系统格式在“1”到“6”之间;发现格式“7”
安装好Subversion和TortoiseSVN之后.检出和浏览版本库的时候一直报错 "期望文件系统格式在"1"到"6"之间;发现格式"7 ...
- 浅谈如何使用代码为MP3文件写入ID3Tags
作者:郑童宇 GitHub:https://github.com/CrazyZty 1.前言 做了三年左右的Android开发,一直没写过博客,最近正好打算换工作,算是闲一些,就将以前开发所遇到的一些 ...
- 云计算三种服务模式SaaS、PaaS和IaaS及其之间关系(顺带CaaS、MaaS)
云计算架构图 很明显,这五者之间主要的区别在于第一个单词,而aaS都是as-a-service(即服务)的意思,这五个模式都是近年来兴起的,且这五者都是云计算的落地产品,所以我们先来了解一下云计算是什 ...