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基础DOM和CSS操作

    $('#box').html();//获取 html 内容$('#box').text();//获取文本内容,会自动清理 html 标签$('#box').html('<em>www.li ...

  2. python——生成器

    python——生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个 ...

  3. Linux下Gcc生成和使用静态库和动态库详解

    参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库 ...

  4. wp7 xml

    public class DynamicXMLNode : DynamicObject { XElement node; public DynamicXMLNode(XElement node) { ...

  5. Sql server之路 (一)基础学习

    查询 1.Select * from表名 2.Select 字段1,字段2,from表名 3.Select 字段1,字段2,...from表名 where 字段1 in('内容') 插入 1.inse ...

  6. LightOJ 1079 Just another Robbery 概率背包

    Description As Harry Potter series is over, Harry has no job. Since he wants to make quick money, (h ...

  7. JavaScript案例七:简单生成表格

    JavaScript简单生成表格,巩固基础知识点... <!DOCTYPE html> <html> <head> <title>JavaScript简 ...

  8. linux全部命令

    linux全部命令 一.安装和登陆命令1.进入图形界面startx 2.进入图形界面init 5 3.进入字符界面init 3 4.登陆login 5.关机poweroff-p 关闭机器的时候关闭电源 ...

  9. java 线程的几种状态

    java thread的运行周期中, 有几种状态, 在 java.lang.Thread.State 中有详细定义和说明: NEW 状态是指线程刚创建, 尚未启动 RUNNABLE 状态是线程正在正常 ...

  10. js:语言精髓笔记7----原型继承

    面向对象有三个基本特性:封装,继承,多态:如果都满足的话称为面向对象语言:而部分满足则称为基于对象语言: 数据类型实现模型描述: JavaScript对象模型: 构造过程:函数->构造器 构造器 ...