PHP 对象和引用总结
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 对象和引用总结的更多相关文章
- 浅谈Java中的对象和引用
浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...
- static成员变量与返回对象的引用
(1)用static修饰类成员变量(属性),表明该变量是静态的,无论创建多少对象,都只创建一个一个静态属性副本,也就是对象们共享同一个静态属性,这个方法常用的一个用途就是用来计算程序调用了多少次这个类 ...
- 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用
[源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, con ...
- Python 对象的引用计数和拷贝
Python 对象的引用计数和拷贝 Python是一种面向对象的语言,包括变量.函数.类.模块等等一切皆对象. 在python中,每个对象有以下三个属性: 1.id,每个对象都有一个唯一的身份标识自己 ...
- Python基础一. 简介、变量、对象及引用
一.Python简介 Python是一门计算机编程语言,它是由荷兰人Guido van Rossum在1989年圣诞节期间为了打发无聊的圣诞节而编写的,作为ABC语言的继承 特性: 面向对象.解释型. ...
- python学习笔记4(对象/引用;多范式; 上下文管理器)
### Python的强大很大一部分原因在于,它提供有很多已经写好的,可以现成用的对象 21. 动态类型:对象/引用 对象和引用: 对象是储存在内存中的实体,对象名只是指向这一对象的引用(refere ...
- Java数据类型和对象的引用
在Java中,变量分为两类: 1.基本类型变量,java是传递的副本 2.一切对象型变量,传引用副本的实质是复制指向地址的指针 a.基本类型引用 public class BasicTransmit ...
- opener 属性是一个可读可写的属性,可返回对创建该窗口的 Window 对象的引用
opener 属性是一个可读可写的属性,可返回对创建该窗口的 Window 对象的引用
- 读 Runtime 源码:对象与引用计数
以前只是看了很多博客,这次打算看一下源码,并记录下来.想到哪里就读到哪里,写到哪里.读的代码版本是:objc runtime 680,可以从这里下载 https://github.com/RetVal ...
- c#问答篇:对象与引用变量-----初学者的困惑
转自:http://www.cnblogs.com/huangyu/archive/2004/08/02/29622.html 从宏观的角度来看,对象是类的实例.比如: //定义一个名为Someone ...
随机推荐
- RocketMQ最佳实践
1.RocketMQ中的专业术语 Topic topic表示消息的第一级类型,比如一个电商系统的消息可以分为:交易消息.物流消息...... 一条消息必须有一个Topic. Tag Tag表示消息的第 ...
- kvm 克隆虚拟机
两步: 第一步导出XML: [root@ok ~]# virsh dumpxml centos02 >12c.xml 第二步磁盘文件 [root@ok virhost]# cp centos02 ...
- java基础知识回顾之java Thread类学习(十一)--join方法的理解
以下面例子说明下面的源码:main 线程 和 A线程,A线程是main线程创建并且启动的,main线程优先级比较高,正在执行:这个时候main线程调用A.join()之后,main线程一直等待,直到A ...
- Xamarin.Android开发实践(十四)
Xamarin.Android之ListView和Adapter 一.前言 如今不管任何应用都能够看到列表的存在,而本章我们将学习如何使用Xamarin去实现它,以及如何使用适配器和自定义适配器(本文 ...
- Chromium Embedded Framework 中文文档(简介)
转自:http://www.cnblogs.com/think/archive/2011/10/06/CEF-Introduce.html 简介 Chromium Embedded Framework ...
- Android SQLite总结(一) (转)
Android SQLite总结(一) 郑海波 2012-08-21 转载请声明:http://blog.csdn.net/nuptboyzhb/article/details/7891887 前言 ...
- ViewPager和Tabhost结合,可滑动的tabhost
public class ViewPagerActivity extends Activity { List<View> listViews; Context context = null ...
- Hark的数据结构与算法练习之快速排序
前言 快速排序是最常见,也是面试中最容易考的排序方法,这里做一下总结 算法说明 其实这里说的很清楚了:http://blog.csdn.net/morewindows/article/details/ ...
- oracle 11g安装(转)
原文地址:http://www.2cto.com/database/201208/150620.html 一.Oracle 下载 注意Oracle分成两个文件,下载完后,将两个文件解压到同一目录下即可 ...
- 阿里云DRDS:分布式数据库服务
最近在做阿里云相关的项目,用到阿里的很多接口服务的API,于是想把这段项目做个总结,顺便梳理下阿里云的云计算的相关知识点. DRDS:分布式数据库服务. 1.相关术语 DRDS(Distribute ...