php 对象的一些特性
2016-09-08 23:13
204 查看
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。
相关文章推荐
- 实例简介PHP的一些高级面相对象编程的特性
- 对php一些服务器端特性配置,加强php的安全
- PHP反射的一些特性
- PHP面向对象高级特性初探
- php的面向对象相关特性
- php对象的高级特性
- 通过对php一些服务器端特性的配置加强php的安全
- PHP中的一些新特性
- php一些特性,原来真的是这样的哦,大家都知道一些吗?我知道的不错!呵呵!
- 《PHP对象、模式与实践》之高级特性
- PHP基础----面向对象相关特性----11成员方法和类方法
- PHP5.3的新特性(一):对象接口的变化
- PHP 杂谈《重构-改善既有代码的设计》之二 对象之间搬移特性
- PHP 杂谈《重构-改善既有代码的设计》之二 对象之间搬移特性【链接:http://www.cnblogs.com/baochuan/archive/2012/04/01/2427199.html】
- 通过对php一些服务器端特性的配置加强php的安全
- PHP对象实例化时的重要特性
- C++和PHP在面性对象特性上的对比
- php学习笔记(四十一)smarty3的一些新特性
- C++和PHP在面性对象特性上的对比
- PHP基础----面向对象相关特性----12类的继承与方法重写