PHP 中使用 简单变量对象 时的区别:

① 很多数据类型都可以写时复制(copy-on-write),例:

<?php
$a = 'test1';
$b = $a;
$b = 'test2';
echo $a;

输出:test1

$b = $a 是传值的拷贝,对 $b 做任何改动都不影响原值 $a。

② 将一个对象赋值给另一个对象时,并没有复制第一个对象的内容,而是通过 引用 将第二个对象指向第一个对象,例:

<?php
class Human {
public $name;
} $person1 = new Human();
$person1->name = 'John'; $person2 = $person1;
$person2->name = 'Dee'; echo 'person one is ',$person1->name,' and person two is ',$person2->name;

输出:person one is Dee and person two is Dee

可以通过 == 操作符来比较两个对象,看两者是否具有相同的类和属性;

还可以通过 === 来判断两者是否引用同一个原始对象:

<?php
class Human {
public $name;
} $person1 = new Human();
$person1->name = 'John'; $person2 = $person1;
$person2->name = 'Dee'; echo 'person one is ',$person1->name,' and person two is ',$person2->name,'.<br />'; if($person1 == $person2) {
echo 'equiv <br />';
} if($person1 === $person2){
echo 'exact same object!';
}

输出:

person one is Dee and person two is Dee.
equiv 
exact same object!

说明:当两个变量指向相同的值时,=== 比较操作符会返回 true。如果两个对象完全相同,但存储在不同的位置,将返回 false。

对象总是通过 引用传递。如果需要为一个已经存在的对象复制一个单独的副本,而不是提供一个指向自己的引用,可以使用 clone 关键字来创建:

<?php
class Human {
public $name;
} $person1 = new Human();
$person1->name = 'John'; $person2 = clone $person1;
$person2->name = 'Dee'; echo 'person one is ',$person1->name,' and person two is ',$person2->name,'.<br />'; if($person1 == $person2) {
echo 'equiv <br />';
}else{
echo 'not equiv <br />';
} if($person1 === $person2){
echo 'exact same object!';
}else{
echo 'not the same';
}

输出:

person one is John and person two is Dee.
not equiv 
not the same

说明:使用 clone 关键字会从同一个类中重新创建一个对象,该对象和原始对象一样具有所有相同的属性,这两个对象之间没有链接,可以放心地进行修改。

PHP 中魔术方法 __clone() 可以在复制一个已经声明了的对象时调用该方法。因此可以通过声明该方法来决定复制对象时会做些什么:

<?php
class Human {
public $name; public function __clone(){
echo 'clone... <br />';
}
} $person1 = new Human();
$person1->name = 'John'; $person2 = clone $person1;
$person2->name = 'Dee'; echo 'person one is ',$person1->name,' and person two is ',$person2->name,'.<br />'; if($person1 == $person2) {
echo 'equiv <br />';
}else{
echo 'not equiv <br />';
} if($person1 === $person2){
echo 'exact same object!';
}else{
echo 'not the same';
}

输出:

clone... 
person one is John and person two is Dee.
not equiv 
not the same

由于对象总是通过引用传递,表明无需从一个方法中返回一个对象来观察它的变化,然而,可以通过从一个方法中返回 $this 在程序内建立一个流畅的接口(fluent interface),通过该接口将方法链在一起:

<?php
class Human {
protected $name;
protected $wight; public function setName($name) {
echo 'my name is '.$name.'<br />';
$this->name = $name;
return $this;
} public function setWeight($weight) {
echo 'my weight is '.$weight.' kg <br />';
$this->weight = $weight;
return $this;
}
} $person = new Human();
$person->setName('dee')->setWeight('130');

输出:

my name is dee
my weight is 130 kg

说明:return $this 的意思是得到从方法中返回的修正对象。

PHP 对象和引用总结的更多相关文章

  1. 浅谈Java中的对象和引用

    浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...

  2. static成员变量与返回对象的引用

    (1)用static修饰类成员变量(属性),表明该变量是静态的,无论创建多少对象,都只创建一个一个静态属性副本,也就是对象们共享同一个静态属性,这个方法常用的一个用途就是用来计算程序调用了多少次这个类 ...

  3. 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用

    [源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象,  const 指针和指向 const 对象的指针, con ...

  4. Python 对象的引用计数和拷贝

    Python 对象的引用计数和拷贝 Python是一种面向对象的语言,包括变量.函数.类.模块等等一切皆对象. 在python中,每个对象有以下三个属性: 1.id,每个对象都有一个唯一的身份标识自己 ...

  5. Python基础一. 简介、变量、对象及引用

    一.Python简介 Python是一门计算机编程语言,它是由荷兰人Guido van Rossum在1989年圣诞节期间为了打发无聊的圣诞节而编写的,作为ABC语言的继承 特性: 面向对象.解释型. ...

  6. python学习笔记4(对象/引用;多范式; 上下文管理器)

    ### Python的强大很大一部分原因在于,它提供有很多已经写好的,可以现成用的对象 21. 动态类型:对象/引用 对象和引用: 对象是储存在内存中的实体,对象名只是指向这一对象的引用(refere ...

  7. Java数据类型和对象的引用

    在Java中,变量分为两类: 1.基本类型变量,java是传递的副本 2.一切对象型变量,传引用副本的实质是复制指向地址的指针 a.基本类型引用 public class BasicTransmit ...

  8. opener 属性是一个可读可写的属性,可返回对创建该窗口的 Window 对象的引用

    opener 属性是一个可读可写的属性,可返回对创建该窗口的 Window 对象的引用

  9. 读 Runtime 源码:对象与引用计数

    以前只是看了很多博客,这次打算看一下源码,并记录下来.想到哪里就读到哪里,写到哪里.读的代码版本是:objc runtime 680,可以从这里下载 https://github.com/RetVal ...

  10. c#问答篇:对象与引用变量-----初学者的困惑

    转自:http://www.cnblogs.com/huangyu/archive/2004/08/02/29622.html 从宏观的角度来看,对象是类的实例.比如: //定义一个名为Someone ...

随机推荐

  1. dfs常见的配置文件中的value与description

    照抄于网络: name value description dfs.namenode.logging.level info The logging level for dfs namenode. Ot ...

  2. hadoop的关键进程

    hadoop集群中主要进程有master:   NameNode, ResourceManager,slaves:   DataNode, NodeManager,  RunJar, MRAppMas ...

  3. ***PHP中empty()和isset()的区别

    对于初学php的人来说,empty()和和isset()用法的区别是很难搞清楚的,他们的用法的差别不仔细去琢磨的话确实很难弄清楚. 先说一下他们的共同点: 都可以判定一个变量是否为空: 都返回bool ...

  4. IIS网站服务器性能优化指南(转载)

    原文网址:http://www.phontol.com/20090507_419416_1.html       Windows Server自带的互联网信息服务器(Internet Informat ...

  5. 关于WM_CTLCOLOREDIT的处理的一些问题

    在为duilib封装系统控件的过程中, 再一次遇到了系统EDIT控件文字颜色/文字背景颜色的处理问题. 不要小看这个消息, 她很可能不会让你如愿以偿. 其实我要的目的很简单: 1. 改变文字颜色    ...

  6. jetty与hessian结合

    Hessian是由caucho提供的一个基于binary-RPC实现的远程通讯library,支持多种语言,包括c++,java,c#等,还支持flash/flex     Jetty 是一个开源的s ...

  7. Gym 100463D Evil DFS

    Evil Time Limit: 5 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100463/attachments Descri ...

  8. XML基础总结2

    在上篇的博客中,我们系统的介绍了一下xml与html之间的异同以及一部分xml的特性或者说是优点,接下来,我们就xml文档的一些语法规则具体向大家阐述一下: 1.xml文档形成了一种"树结构 ...

  9. yuv rgb 像素格式1

    ===========大小============= 一般,直接采集到的视频数据是RGB24的格式 RGB24一帧的大小size=width×heigth×3 Byte, RGB32的size=wid ...

  10. Github排行榜

    http://githubranking.com/ 中国区开发者排行榜: http://githubrank.com/ 也可以在官网查询: https://github.com/search?q=st ...