当前位置: 首页 > news >正文

php变量持有对象的引用,我对PHP变量引用、对象引用的理解

变量引用

我们可以知道在PHP中,变量以 $ 符号开头,其后是变量的名称。变量可以对一个内容进行引用,PHP 的引用允许你用两个变量来指向同一个内容 。

示例代码如下:123456<?php $a = 1;$b =$a;echo '$a ='.$a.'; '.'$b = '.$b."\n".$b = 2;echo '$a ='.$a.'; '.'$b = '.$b."\n".

输出结果:12$a = 1;$b = 1;$a = 1;$b = 2;

$a将值赋给了$b,拷贝一份右边的变量给b,会生成一份内存空间,结果可能是同样的内容在内存中两份。此时变量a与变量b同时指向同一个内容“1”,所以输出结果均为“1”。当“$b = 2”语句执行时,将变量b改成指向了内容“2”,原变量a并无影响,只是变量b的指向发生了改变,所以输出结果变量a无变化,变量b为“2”。

下面来看另一种情况,示例代码如下:123456<?php $c = 1;$d = &$c;echo '$c ='.$c.'; '.'$d = '.$d."\n".$d = 2;echo '$c ='.$c.'; '.'$d = '.$d."\n".

输出结果:12$c = 1;$b = 1;$c = 2;$b = 2;

$c将值赋给了$d的时候,加上了“&”符号,符号"&"表示引用。使用引用,php引擎不会拷贝一份变量,其实就是将指针指向了$a在内存中的地址,$b中就是保存了这个指针。对它们中的任意一个进行修改都会影响到其他变量,而删除其中的一个变量,其他都会被作用到。

对象引用

在说明对象的引用的时候,先插入一个概念(析构函数):析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行,释放对象所占用的内存。下面来看看示例代码:

情况1:<?phpclass  A{$name ="Jam";}$b =new A();$c =$b;echo $b->name;echo $c->name;$b->name ="Bob";echo $c->name;$b = null ;$c = null ;//此时调用析构函数?>

输出结果:Jam      Jam     Bob

情况2:<?phpclass  A{$name ="Jam";}$b =new A();$c = &$b;echo $b->name;echo $c->name;$b->name ="Bob";echo $c->name;$b = null ;//此时调用析构函数?>

输出结果:Jam      Jam     Bob

从情况1可以看出,$b 和 $c都可以调用函数A中的属性,它们当中某一方都可以对属性内容进行更改,在$b和$c都为空的时候,即没有变量在引用对象了,此时会调用析构函数。在情况2中,在变量赋值时加入了&符号,意为复制出一个$c等同与$b,两者为相等的关系。当其中一方为空时,另一方也会为空,此时调用析构函数。

相关文章:

  • php 自动填写表单,PHP自动生成表单代码分享
  • 记事本底部的java切换,如何使用java操作记事本(转)
  • php类调用类外变量吗,如何调用类外的变量
  • matlab中单相整流器,一种新型单相脉冲整流器的MATLAB仿真研究
  • matlab中支持向量机网格,MATLAB中SVM(支持向量机)的用法
  • mysql出现帮助,MySQL之帮助的使用
  • 不会matlab下载,下载的用MATLAB实现的DTW算法,不会用,跪求大神帮忙
  • mysql序列号重置,当我们更改小于当前序列号的AUTO_INCREMENT值时,MySQL将返回什么?...
  • mysql聚合函数详解,MySQL常用聚合函数详解
  • php 年月日自动更新,php生成年月日下载列表的方法
  • java 去掉字符串中的注释,Python删除Java源文件中全部注释的实现方法
  • 如何修改oracle储存路径,oracle中如何修改表空间的数据文件路径
  • php读取excel怎么读取sheet2,PHP读取Excel 之 Spreadsheet_Excel_Reader
  • oracle新建用户和实例,Oracle新建用户、角色,授权,建表空间实例(1/2)
  • oracle10gsys默认,Oracle数据库sys和system用户的默认密码及如何修改密码
  • 【391天】每日项目总结系列128(2018.03.03)
  • 77. Combinations
  • Cookie 在前端中的实践
  • DataBase in Android
  • gitlab-ci配置详解(一)
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • Mysql5.6主从复制
  • Promise面试题,控制异步流程
  • Redash本地开发环境搭建
  • Redis 中的布隆过滤器
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • webpack+react项目初体验——记录我的webpack环境配置
  • 测试开发系类之接口自动化测试
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 消息队列系列二(IOT中消息队列的应用)
  • 一道面试题引发的“血案”
  • 一起参Ember.js讨论、问答社区。
  • 以太坊客户端Geth命令参数详解
  • 因为阿里,他们成了“杭漂”
  • Spring第一个helloWorld
  • ​Spring Boot 分片上传文件
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #NOIP 2014#Day.2 T3 解方程
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (6)添加vue-cookie
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (vue)页面文件上传获取:action地址
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (十)T检验-第一部分
  • (四) 虚拟摄像头vivi体验
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)visual stdio 书签功能介绍
  • ..回顾17,展望18
  • .NET Core Web APi类库如何内嵌运行?
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?