class person
{
private $name;
private $age = 2;
public function __construct($name,$age)
{
$this->name = $name;
$this->age = $age;
}
} $p1 = new person('gxw',12);
$p2 = new person('gxw',12); if($p1 == $p2){
echo "p1 == p2";
}else{
echo "p1 != p2";
} //echo p1 == p1 if($p1 === $p2){
echo "p1 == p2";
}else{
echo "p1 != p2";
} //echo p1 != p2

‘== ’  用于判断两个对象实例的所有属性是否都相等。

‘===’  用于判断两个变量是否是同一个对象的引用。

$p3 = $p1;
if($p3 === $p1){
echo 'p3 == p1';
}else{
echo 'p3 != p1';
}//echo 'p3 == p1' $p3->name = 'www';
if($p3 == $p1){
echo 'p3 == p1';
}else{
echo 'p3 != p1';
} //echo p3==p1

  p3 为p1 的引用,更改p3同时影响到p1,  可以说p3为p1的浅拷贝。这种情况经常出现在函数传参

$p1 = new person('gxw',12);
function change($tmp){
$tmp->name ='tmp';
} change($p1);
echo $p1->name;
//echo tmp $str = 'hello'; function zero($tmp){
$tmp = '';
}
zero($str);
echo $str; //echo hello

  

可以看出php对函数传参进行过特殊处理,在传 类对象实例时,传得是引用。 而在传字符串类型及其他基础类型时,会先进行copy。

通过clone 关键字(注意是关键字,不是方法) 来进行对象的深拷贝

$p4 = clone $p1;
$p4->name = 'hello';
if($p1 == $p4){
echo 'p1 == p4';
}else{
echo 'p1 != p4';
} //echo p1 != p4

看到p1 的name 并没有因为p4的name的改变而改变,说明p4 为p1的深拷贝.

我们还可以重载clone 方法,达到一些特定的复制效果。

class hand
{
public $size = 5;
} class person
{
public $name;
public $age = 2;
public $hand;
public function __construct($name,$age)
{
$this->name = $name;
$this->age = $age;
$this->hand = new hand();
} public function __clone()
{
// TODO: Implement __clone() method.
} } $p1 = new person('gxw',12);
$p2 = new person('gxw',12); if($p1->name === $p2->name){
echo 'p1->name === p2->name';
}
if($p1->hand === $p2->hand){
echo "p1->hand === p2->hand";
}

p1 和 p2 的 name 进行===判断的时候发现相同,而hand进行===判断的时候发现两者不同。

可以看出===对 基础字符串类型的判断 和自定义对象类型的判断标准时不同的。

$p3 = $p1;
if($p3->hand === $p1->hand){
echo "same";
}else{
echo "diff";
} if($p3->name === $p1->name){
echo "same";
}else{
echo "diff";
}
$p3->name = 'world';
echo $p1->name; //echo world
$p3->hand->size = 10;
echo $p1->hand->size; //echo 10 $p4 = clone $p1;
if($p4->name === $p1->name){
echo 'same';
} if($p4->hand === $p1->hand){
echo "same";
}
$p4->name = 'hello';
echo $p1->name; //echo 'world';
$p4->hand->size = 6;
echo $p1->hand->size; //echo '6'

 可以看出 = 赋值和clone 的区别。 p3的修改会影响p1 。 而p4中的基础类型属性(name)修改不会影响p1,而对象类型属性(hand)的修改会影响p1,引为clone关键字 默认不会对 对象类型属性进行深拷贝。

 public function __clone()
{
// TODO: Implement __clone() method.
$this->hand = clone $this->hand;
}

 修改__clone函数后,发现 p4 中对hand的修改不会影响到p1。

最新文章

  1. 《3D Math Primer for Graphics and Game Development》读书笔记2
  2. 分享个win平台cocos2d-x创建项目的快捷方式
  3. XP/Win7下QTP11循环试用30天的破解方法
  4. module中build.gradle文件参数含义
  5. php spl
  6. [LeetCode] Container With Most Water 简要分析
  7. servlet核心API的UML图
  8. 设计模式之适配器模式(Decorator)
  9. Redis客户端管理工具,状态监控工具
  10. Java 并发编程内部分享PPT分享
  11. 【BZOJ1001】狼抓兔子(网络流)
  12. 前端axios下载excel,并解决axios返回header无法获取所有数据的问题
  13. [daily][python2] int型IP地址与string型IP地址互转
  14. # 20175227 2018-2019-2 《Java程序设计》第一周学习总结
  15. PHP字符串函数之 sscanf echo print sprintf vsprintf printf vprintf fprintf vfprintf
  16. Python3.7 数字之间下划线
  17. 发送html内容的email(转)
  18. java 抽象类 接口 区别
  19. classnofoundexception:org.springframework.ui.freemarker.FreeMarkerConfigurationFactory
  20. MapReduce源码分析之JobSubmitter(一)

热门文章

  1. spark1.3的部署
  2. Javascript 文件操作(整理版)
  3. getInitParameter()
  4. mysql三种binlog日志的理解
  5. java内部类实现多继承
  6. C++中的函数指针用法
  7. Struts+Spring+Hibernate进阶开端(一)
  8. C语言预处理指令的初步了解
  9. 1170: 非常男女(XCOJ 前缀和)
  10. NSString、NSData、char* 类型之间的转换-备