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.ini 文件位置在哪里,怎么找到 php.ini
- php之快速入门学习-18(PHP 面向对象)
- php之快速入门学习-17(PHP 命名空间)
- PHP 预定义接口 ArrayAccess(数组式访问对象)
- PHP依赖注入,控制反转,反射、Ioc容器和服务提供者各个概念的理解和使用
- PHP二维数组转一维数组
- php后台开发(二)Laravel框架
- 基于 Docker 的 PHP 开发环境
- 《MySQL DBA修炼之道》——3.4 PHP开发
- PHP 之 FastCGI 与 mod_php 详解
- PHP全栈学习笔记24
- php Excel 导入
- Nginx + php-fpm 执行 PHP 脚本超时 报错 502 Bad Gateway + 504 Gateway Time-out 的解决办法
- PHP 错误与异常 笔记与总结(14 )记录和发送异常信息
- PHP 错误与异常 笔记与总结(3)PHP 配置文件(php.ini)中与错误相关的选项 与 设置错误级别
- PHP 设计模式 笔记与总结(10)数据对象映射模式 2
- PHP 设计模式 笔记与总结(2)开发 PSR-0 的基础框架
- PHP 多个文件上传
- 《PHP和MySQL Web开发从新手到高手(第5版)》一2.4 创建数据库
- PHP Hash Collision攻击原理
- .NET/ASP.NET/C#/WCF/SQL Server/My SQL/Java/JSP/JDBC/Spring/Spring MVC/PHP/Python/Ruby/Shell/Agile/CSS/HTML/HTTP/Unix/Linux大量PDF书籍/电子书籍下载, Effective Java 下载
- [转]PHP开发中涉及到emoji表情的三种处理方法
- php判断对象是否为空
- php mkdir No such file or director问题
- PHP为JSON数据的API返回空数组或者空对象
- php模板原理PHP模板引擎smarty模板原理浅谈
- 深入理解php内核 编写扩展 I:介绍PHP和Zend
- 如何判断PHP 是线程安全还是非线程安全的
- PHP 使用redis实现秒杀
- php pdo对象使用详解: 连接数据库与exec方法
- PHP中的替代语法(冒号、endif、endwhile、endfor)
- php一些单选、复选框的默认选择方法(示例)