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. Linux文件系统的设计

    总论: linux的文件系统设计非常优秀,总的来讲有两大部分,第一部分就是树形的组织结构,第二部分就是vfs,树形的组织结构组织了文件系统的表象,用户非常方便的使用,而vfs是文件系统的实现机理,它处 ...

  2. Struts2 页面url请求怎样找action

    1.我们使用最原始的方法去查找action.不同注解. struts.xml文件先配置 <!-- 新闻信息action --> <action name="newsInfo ...

  3. IOS Layer的使用

    CALayer(层)是屏幕上的一个矩形区域,在每一个UIView中都包含一个根CALayer,在UIView上的所有视觉效果都是在这个Layer上进行的. CALayer外形特征主要包括: 1.层的大 ...

  4. const与define的异同

    1. DEFINE是预处理指令,是简单的文字替换:而const是关键字,用于变量声明的修饰. 2. DEFINE替换的结果可以是数值.表达式.字符串.甚至是一个程序:而const只能限定变量为不可修改 ...

  5. axis WebServices 完美调用天气预报,查询、显示 代码!

    axis WebServices 完美调用天气预报,查询.显示 代码! 效果: jsp页面: <%@ page language="java" import="ja ...

  6. js获取浏览器滚动条距离顶端的距离

    最近在做项目的时候遇到需要用js获取滚动条距离窗口顶端的距离和js获取浏览器可视化窗口的大小,在这儿做一个整理保存:    一.jQuery获取的相关方法 jquery 获取滚动条高度 获取浏览器显示 ...

  7. 创建和管理表【weber出品必属精品】

    创建表 必须有 : 1. CREATE TABLE 的权限 SQL> conn /as sysdba 已连接. SQL> create user test default tablespa ...

  8. 利用MiddleGen-hibernate-r5生成hbm文件及POJO文件

    1       先决条件 1.1    已安装JDK(版本1.5以上)并配置环境变量 到http://java.sun.com上下载JDK,配置环境变量(我的电脑右键->属性->高级-&g ...

  9. GetClientRect()和GetWindowRect()

    GetClientRect()   是得到客户区坐标系下客户区的RECT GetWindowRect()是得到屏幕坐标系下整个窗口的RECT GetSystemMetrics()是获得屏幕分辨率大小 ...

  10. c# 中的线程和同步

    一.新建线程的3种方法 a)异步委托:b)Thread类:c)线程池: 二.异步委托 1.简单使用,检查委托是否完成其任务 a) 通过 BeginInvoke()  的返回值IAsyncResult ...