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 对象的一些特性的更多相关文章

  1. JavaScript高级 面向对象(11)--对象的动态特性-关联数组用法

    说明(2017.4.2): 1. 对象的动态特性: (1)在js中,一个对象需要属性,就可以利用“对象名.属性 = 值”的方式为其添加,只要赋值成功,对象就新增这个属性. (2)对象属性的访问形式: ...

  2. js中对象的一些特性,JSON,scroll家族

    一.js中对象的一些特性 对象的动态特性 1.当对象有这个属性时,会对属性的值重写 2.当对象没有这个属性时,会为对象创建一个新属性,并赋值 获得对象的属性的方式 为元素设置DOM0级事件 二.JSO ...

  3. PHP 对象及其三大特性

    //面向过程 //类和对象 //对象:任何东西都可以成为对象,类实例化出来的东西 //类:对所有同类的对象抽象出来的东西 //info:code,name,sex,nation,birthday // ...

  4. js 中对象属性的特性

    数据属性: 数据属性包含一个数据值的位置,在这个位置可以读取和写入值. 4个描述的行为特性: writable  表示能否修改属性的值.默认为true Enumerable 表示能否过过for in循 ...

  5. JavaScript之面向对象的概念,对象属性和对象属性的特性简介

    一.大家都知道,面向对象语言有一个标志,那就是他们都有类的概念,通过类我们可以创建任意多个具有相同属性和方法的对象.但ECMAScript(指定JavaScript标准的机构,也就是说JavaScri ...

  6. OC学习6——面相对象的三大特性

    我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这也是面向对象的三大特征.OC学习篇之---类的三大特性(封装,继承,多态) 1.封装(Encapsulation)是指将对象的状态信息 ...

  7. 浅谈python的对象的三大特性之继承

    前面我们定义了人的类,并用这个类实例化出两个人jack和lily,查看了它们的内存空间. 现在我们再来看看类中所存在的对向对象编程的三大特性之继承的一些特性. 前面定义了一个人的类,可是我们还知道,人 ...

  8. String对象常量池特性对synchronized对象的影响

    一 .什么是String的常量池特性 对于字符串对象有两种创建方法,如下: 直接赋值法: String str1="直接赋值创建字符串"; 创建对象法: String str2=n ...

  9. 深入理解python之一——python3对象的一些特性

    文章使用markdown写的,编辑的时候行间距还可以,显示的时候行间距好小,我也没办法. 首先,需要明白的是python是一种解释性语言标准,他可以由c.java或者其他语言来实现.在python的标 ...

  10. python面向对象(类和对象及三大特性)

    类和对象是什么 创建类 新式类 和 经典类 面向对象三大特性 继承 封装 多态   面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...

随机推荐

  1. web.xml配置DispatcherServlet

    1. org.springframework.web.servlet.DispatcherServlet 所在jar包: <dependency> <groupId>org.s ...

  2. HTML5新增的一些属性和功能之一

    大致可以分为10个方面: HTML5表单元素和属性 表单2.0 视音频处理 canvas绘图 SVG绘图 地理定位 拖放技术 web work web storage web socket 一.新的i ...

  3. 如何在android上去控制开发进度

    这次android的壁纸软件1.0版本终于可以上线了,软件的功能基本上实现了,但是用户体验不太好.在整个开发阶段和测试阶段,出现了很多预料之外的事情,比如size是1M多的json文件解析.高清图片导 ...

  4. Python进阶之路---1.2python版本差异

    Python2.*与python3.*版本差异 作为一个初学者,我们应该如何选择python的版本进行学习呢,这两个版本有什么区别呢,接下来让我们简单了解一下,以便我们后续的学习. Python版本差 ...

  5. Impala 源码分析-FE

    By yhluo 2015年7月29日 Impala 3 Comments Impala 源代码目录结构 SQL 解析 Impala 的 SQL 解析与执行计划生成部分是由 impala-fronte ...

  6. LNMP优化

        LNMP优化 LNMP优化从系统安全,系统资源占用率,及web服务并发负载这三个方面体现,并   且主要体现在web服务并发负载这一方面.     1:首先进行linux优化加固  Linux ...

  7. JAVA与JSON的序列化、反序列化

    package com.linkage.app.memcache; import java.util.HashMap;import java.util.Map.Entry; import net.sf ...

  8. textField:shouldChangeCharactersInRange:replacementString:

    http://blog.csdn.net/mamong/article/details/44964801

  9. AngularJS 父子控制器

    <!doctype html> <html ng-app="myApp"> <head> <script src="C:\\Us ...

  10. Managing TCP Connections in Dynamic Spectrum Access Based Wireless LANs

    2010年IEEE Secon的一篇文章.当然了,应该是之前就写好了,发表过,还是直接投到Secon了呢?直接投的吧,Secon不接受已发表过的吧. 本文的着笔点:有线网与DSAN(启用了DSA特性的 ...