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。

(0)

相关推荐

  • PHP基础陷阱题(变量赋值)

    复制代码 代码如下: <?php $a=3; $b=6; if($a=5||$b=7){ $a++; $b++; } var_dump($a, $b); 陷阱一 把$a=5.$b=7看成了$a==5.$b==7 错误结果:3,6 陷阱二 运算符的优先级,认为$a=5赋值成功$b=7没执行 错误结果:6,7 正确理解 陷阱是运算符的优先,赋值运算符(=)的优先级是最低的,所以正确理解应该是 $a=(5||$b=7) 正确结果:true,7 升级一下 变形一 复制代码 代码如下: $a=3; $b=

  • PHP中=赋值操作符对不同数据类型的不同行为

    首先解释赋值操作符=的行为,看下面的例子: 复制代码 代码如下: $i = 0; $j = $i; $j = 0; echo $j; // 打印输出0 $arr = array(0); $arr2 = $arr; $arr2[0] = 1; echo $arr[0]; //打印输出0 class B { public $i = 0; } $b = new B(); $c = $b; $c->i = 1; echo($b->i); // 打印输出1 从这个例子可以看出,如果=操作符右边的变量为基

  • php 传值赋值与引用赋值的区别

    传值赋值:当将一个表达式的值赋予一个变量时,整个原始表达式的值被赋予到目标变量.这意味着,例如,当一个变量的值赋予另一个变量时,改变其中一个变量的值,将不会影响到另一个变量. 复制代码 代码如下: <?php <?php $a=123; $a=123; $b=$a; $b=&$a; $a=321; $a=321; Echo"$a,$b";//显示"321,123" Echo"$a,$b";//显示"321,321&q

  • php传值赋值和传地址赋值用法实例分析

    本文实例讲述了php传值赋值和传地址赋值用法.分享给大家供大家参考.具体如下: <?php $name = 'Simon'; //对变量$name进行赋值(传值赋值) $name_b = $name; //对变量$name_b进行赋值(传值赋值) $addr = &$name; //对变量$addr进行赋值(传地址赋值) $name = "Elaine"; //改变$name的值 echo $name; //输出$name,会发现$name的值发生了变化 echo $na

  • php使用post数组的键值创建同名变量并赋值的方法

    本文实例讲述了php使用post数组的键值创建同名变量并赋值的方法.分享给大家供大家参考.具体如下: 这段代码可以自动根据post数组的键值创建同名变量,这个功能使用非常方便,不用提前声明变量 <?php $expected=array('username','age','city','street'); foreach($expected as $key){ if(!empty($_POST[$key])){ ${key}=$_POST[$key]; } else{ ${key}=NULL;

  • php数组操作之键名比较与差集、交集赋值的方法

    本文实例讲述了php数组操作之键名比较与差集.交集赋值的方法.分享给大家供大家参考.具体方法如下: 该实例主要实现对数组的各种常见操作.如对键名比较计算数组的差集,计算差集,给指定数组中插入一个元素,反转数组与交集赋值新的数组等. 具体代码如下: 复制代码 代码如下: //定义回调函数 function key_compare_func($key1,$key2) {   if($key1==$key2)         //如果两参数相等   return 0;          //返回0  

  • php foreach 使用&(与运算符)引用赋值要注意的问题

    foreach 通过在 $value 之前加上 & 很容易就能修改数组的单元,如: PHP代码 复制代码 代码如下: foreach($arr as $value){ $value .= '4'; } 但这个用法也很容易造成错误,而且也不容易找. 看例子更直截了当: PHP代码 复制代码 代码如下: <?php $arr = array('a','b','c'); $arr2 = array('d', 'e', 'f'); foreach($arr as $value){//习惯用$valu

  • 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

  • python中的五种异常处理机制介绍

    从几年前开始学习编程直到现在,一直对程序中的异常处理怀有恐惧和排斥心理.之所以这样,是因为不了解.这次攻python,首先把自己最畏惧和最不熟悉的几块内容列出来,里面就有「异常处理」这一项. <Dive into Python>并没有专门介绍异常处理,只是例子中用到的时候略微说明了一下.今天下载<Learn Python>,直接进异常处理这块.这一部分有四章,第一章讲解异常处理的一般使用方法,后面的章节深入地讨论其机制.我目前只看了第一章,先学会用,以后有必要的时候再扩展阅读. p

  • Javascript 赋值机制详解

    今天回答了一个关于 Javascript 的问题,涉及到了赋值问题,因此想把这个问题好好总结下. 复制代码 代码如下: var a = 'test'; var b = function() {}; b.a = 'test'; function change(m, n) {     m = 'change';     n.a = 'change'; } change(a, b); 执行上述代码后,变量 a 和 b 的值会发生改变吗? 原始值和引用值 在 之前的文章中介绍过原始值和引用值,原始值指的

  • 浅析C/C++,Java,PHP,JavaScript,Json数组、对象赋值时最后一个元素后面是否可以带逗号

    1 C,C++,Java,PHP都能容忍末尾的逗号 C,C++,Java中对数组赋值时,最后一个元素末尾的逗号可有可无.下面两行代码对这些语言来说是等效的. int a[] = {1,2,3}; /* 正确 */ int a[] = {1,2,3,}; /* 正确 */ PHP这一点也继承了C的特点,下面的两行代码等效. $a = array(1,2,3); /* 正确 */ $a = array(1,2,3,); /* 正确 */ 2 JavaScript视末尾逗号为语法错误! 然而到了Jav

  • 浅谈将子类对象赋值给父类对象

    最近对将子类对象赋值给父类对象有点心得,想和大家分享一下.但本人水平有限,请各位指正和批评. 言归正传,下面是几个小例子,请大家看一看. 测试一 父类: public class Supclass { public void print() { System.out.println("this is 父类print()方法"+"--此时对象"+this.toString()); } } 子类: public class Subclass extends Supcla

  • Java多态和实现接口的类的对象赋值给接口引用的方法(推荐)

    接口的灵活性就在于"规定一个类必须做什么,而不管你如何做". 我们可以定义一个接口类型的引用变量来引用实现接口的类的实例,当这个引用调用方法时,它会根据实际引用的类的实例来判断具体调用哪个方法,这和上述的超类对象引用访问子类对象的机制相似. //定义接口InterA interface InterA { void fun(); } //实现接口InterA的类B class B implements InterA { public void fun() { System.out.pri

  • Vue对象赋值视图不更新问题及解决方法

    当我们需要对vue里面data数据做动态更新. 如下,实例化了Vue对象,其下vueData为data属性指向,现在我们需要由后台装载完整的data对象 现在我们需要装载更新完整的data对象,常规的赋值方式并不会引起视图的更新,双向绑定会失效. 如上图中默认broker_list为空对象,装载完之后broker_list 包含新项(ZY98) 解决办法: $.each(clientData, function (k, v) { Vue.set(vueData,k,Object.assign({

  • 浅析Python3中的对象垃圾收集机制

    ###概述 GC作为现代编程语言的自动内存管理机制,专注于两件事:1. 找到内存中无用的垃圾资源 2. 清除这些垃圾并把内存让出来给其他对象使用. 在Python中,它在每个对象中保持了一个计数器,用于记录指向该对象的的引用的个数.一旦这个计数器为0时,则立即回收该对象,对象占用的内存空间将被释放. 引用计数 我们可以利用简单的变量引用和销毁窥见引用计数过程. 增加引用计数 增加引用计数的方式多种,即对象进行引用,那么计数器都会+1 # 创建第一个引用 a = 3 # 用其他变量名引用 b =

  • 浅谈Qt QGraphics体系及刷新机制介绍

    概述 Qt的三大体系:QWidget.QGraphics.Quick,其中QGraphics图形框架算是这三个中比较高级的一种用法了,并且使用起来相比另外两个体系会更加的复杂一些,不过它能实现的功能却非常强大,主要体现在对图元的管理,它独特的刷新机制可以在众多的图元中都能够很好的管理,保证整个交互的流畅度. 而这里要描述的就是QGraphics体系的刷新机制以及该体系中相关元素的使用方式及特点. QGraphics体系的三大元素 QGraphics体系中最重要的三大元素:QGraphicsVie

  • Java 类型信息详解和反射机制介绍

    RTTI RTTI(RunTime Type Information)运行时类型信息,能够在程序运行时发现和使用类型信息,把我们从只能在编译期知晓类型信息并操作的局限中解脱出来 传统的多态机制正是 RTTI 的基本使用:假设有一个基类 Shape 和它的三个子类 Circle.Square.Triangle,现在要把 Circle.Square.Triangle 对象放入 List<Shape> 中,在运行时,先把放入其中的所有对象都当作 Object 对象来处理,再自动将类型转换为 Shap

随机推荐