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. 案例(JQuery的ajax无刷新评论)

    CommentsTest.html代码: <head> <meta http-equiv="Content-Type" content="text/ht ...

  2. 【读书笔记】读《JavaScript设计模式》之装饰者模式

    一.定义 装饰者模式可用来透明地把对象包装在具有同样接口的另一个对象之中.这样一来,你可以给一个方法添加一些行为,然后将方法调用传递给原始对象.相对于创建子类来说,使用装饰者对象是一种更灵活的选择(装 ...

  3. svn分支管理进行迭代开发

    [root@ok svndata]# svn co svn://192.168.1.111/app01 # checkout项目到本机 开始规划我们的svn项目目录: [root@ok svndata ...

  4. HTML5 Socket通信

    HTML5 Socket通信使用起来也是相当不从的,先将部分JS代码与大家分享: var socket; function connect() { var host = "ws://&quo ...

  5. javascript 复习代码

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  6. HDU 4612 Warm up tarjan缩环+求最长链

    Warm up Problem Description   N planets are connected by M bidirectional channels that allow instant ...

  7. 【bzoj1066】[SCOI2007]蜥蜴 网络最大流

    [bzoj1066][SCOI2007]蜥蜴 Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的 ...

  8. 由文章缩略图读出banner图

    <div class="banner"> {dede:sql sql="select litpic FROM #@__archives where typei ...

  9. c#知识总结1

    一.C#程序结构 一个c#程序主要包括以下部分 ①命名空间声明 ②一个class ③class方法 ④class属性 ⑤一个main方法 ⑥语句 和 表达式 以及 注释 简单的“Helloworld” ...

  10. Linux下设置memcached访问IP

    在虚拟机上装了memcached,本地访问可以,但从其它机器连这台机器的memcached应用总是报连接失败.防火墙的端口都是打开的.Google了才知道原来需要修改memcached的配置文件,将默 ...