PHP5 的对象赋值机制介绍

看到PHP设计模式中值对象模式中的例题,对于结果总感到有点疑惑。回头看了下PHP5的对象赋值才真正清楚。

复制代码 代码如下:

<?php class SimpleClass{ public $var = 'a default value'; public function displayVar() { echo $this->var; } } $instance = new SimpleClass(); $assigned = $instance; $reference =& $instance; $instance->var = '$assigned will have this value'; $instance = null; // $instance and $reference become null var_dump($instance);var_dump($reference);var_dump($assigned); var_dump($instance); var_dump($assigned); var_dump($reference); ?>

php5 改写了OOP底层。当类生成一个实例(对象)的时候,返回值$instance并不是对象本身,而只是对象的一个id(或者资源句柄),所以, 当$instance被赋值给$assigned的时候,$assigned也指向了这个对象,这有点像普通变量的引用(&)操作。所以,当 对$instance初始化的时候,$assigned也被初始化了。但是,当$instance被销毁(=null)的时候,因为对应的对象还有一个句 柄存在($assigned),所以对象并不会被销毁,析构函数也不会被触发。结果,var_dump($assigned)是对象的值, 而$instance已经是空句柄,显示null。$reference因为与$instance有类似普通变量间的引用关系,所以也成为空句柄,显示 null。

原文发布于微信公众号 - php(phpdaily)

原文发表时间:2015-05-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏进击的君君的前端之路

关于es2015箭头函数的大括号代码块部分的一点理解

922
来自专栏友弟技术工作室

Go 程序的基本结构和要素

示例 package main import "fmt" func main() { fmt.Println("hello, world") } 包...

31711
来自专栏云霄雨霁

Java--类和对象之基础知识

1323
来自专栏用户3030674的专栏

java单例模式

单例设计模式:解决一个类在内存中只存在一个对象  多用于环境变量设置等  单例模式的要求:1.只能有一个对象,禁止其他程序建立该类对象          2....

571
来自专栏程序员互动联盟

【答疑释惑】JavaScript解释器是干什么用的?

问题: ? JavaScript解释器主要是干什么用的?他不是一门语言吗? 解答: JavaScript是一门脚本语言,是需要被别人解释执行的,这个别人就是Ja...

2786
来自专栏企鹅号快讯

php的变量引用与销毁机制

在php中,符号"&"表示引用。 1、看看不引用的情况是这样子: $a = "hello world";//定义一个变量,下面赋值给$b $b = $a;//...

1839
来自专栏IMWeb前端团队

打开Promise的正确姿势

引言 最近实践中需要用到大量的异步回调风格代码的编写,作者最近处于同步编程风格转为异步编程风格的状态。同时第一时间遇到了下面提到的代码,第一直觉就是该代码肯定有...

2775
来自专栏java工会

JAVA 同步实现原理

Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。Synchronized的作用主要有三个:

410
来自专栏破晓之歌

python 模板实现-引擎的编写(有时间试一下)

1.模板的编写:https://blog.csdn.net/MageeLen/article/details/68920913

943
来自专栏达摩兵的技术空间

js中的作用域

相信自从es6出来之后,你一定多少知道或者已经在项目中实践了部分的块级作用域,在函数或者类的内部命名变量已经在使用let了,但是你知道它真正的作用是什么吗?又是...

792

扫码关注云+社区