PHP中对象是按值传递还是按引用传递?
1.首先,什么是按值传递和按引用传递?
按值传递就是仅仅把值传递过去,相当于传递的是值的拷贝,而按引用传递传递的是内存的地址。
在 PHP5 中,如果按引用传递,就是将 zval 的地址赋给另一个变量,这时,两个变量都同时指向一个 zval 。而按值传递则是复制一个 zval,两个变量指向两个不同的 zval 。(为了简化,这里忽略 copy on write)
按引用传递的特点:
$a = 2;
$b = &$a; //按引用传递
$a = 1;
echo $b; //1
$b = 3;
echo $a; //3
2.现证明PHP中对象不是按引用传递:
class Test{
public $a ;
}
$test1 = new Test();
$test2 = $test1;
$test1 = null;
var_dump($test1); // null
var_dump($test2); //object 如果是按引用传递,那么$test2也应该为空!
3.但是,传递对象的时候,也出现了引用传递的特点:
class Test{
public $a ;
}
$test1 = new Test();
$test1->a = '1';
$test2 = $test1;
$test2->a = '2';
echo $test1->a; //2
$test1->a = '3';
echo $test2->a; //3
出现这种情况的原因,是因为在 PHP5 中,真正保存对象的结构是 zend_object,一个变量(zval)里实际保存的是指向该结构体的指针。传递这个变量时,就是拷贝该指针的副本,而这个指针指向存储堆区的对象。
其实,PHP 中所有的传递默认都是按值传递的,这点与 C、JavaScript 等语言相同。要想按引用传递,则必须使用 & 。
PHP中对象是按值传递还是按引用传递?的更多相关文章
- 关于js中一个对象当做参数传递是按值传递还是按引用传递的个人看法
在<JavaScript高级程序设计>这本书中有这样一段话:有很多开发人员错误的认为:在局部作用域中修改的对象会在全局作用域中反映出来,就说明参数是按引用传递的.换句话说,尼古拉认为当一个 ...
- JavaScript中函数参数的按值传递与按引用传递(即按地址传递)
首先声明一句:JavaScript中所有函数的参数都是按值传递的!不存在按引用传递! 在讲传递参数之前我们先来讲一下指针. 学过C指针的应该都知道,指针变量中保存的是一个地址,程序可以根据所保存的地址 ...
- JS基础类型和对象,分别是按值传递还是按引用传递?
在分析这个问题之前,我们需了解什么是按值传递(call by value),什么是按引用传递(call by reference).在计算机科学里,这个部分叫求值策略(Evaluation Strat ...
- js按值传递和按引用传递
摘要:js的数据类型有种划分方式为 原始数据类型和 引用数据类型. 原始数据类型 存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置.栈区包括了 变量的标识符和变量的值. ...
- JS是按值传递还是按引用传递?【转载】
最近遇到个有趣的问题:“JS中的值是按值传递,还是按引用传递呢?” 在分析这个问题之前,我们需了解什么是按值传递(call by value),什么是按引用传递(call by reference). ...
- Java参数按值传递?按引用传递
有时候在想,java在调用方法时候究竟是按值传递还是按引用传递,之前有人说是基本数据类型按值传递,引用类型按引用传递.一时间,似乎都有道理. 笔者在此不追究字眼上的辨别识字能力,把自己对这个问题的理解 ...
- Java的按值传递和按引用传递解说
在网上看到的一个帖子解释Java的按值传递和按引用传递,感觉挺全面,就转过来,以供以后学习参考: 1:按值传递是什么 指的是在方法调用时,传递的参数是按值的拷贝传递.示例如下: public clas ...
- 转------深入理解--Java按值传递和按引用传递
引言 最近刷牛客网上的题目时碰到不少有关Java按值传递和按引用传递的问题,这种题目就是坑呀,在做错了n次之后,查找了多方资料进行总结既可以让自己在总结中得到提高,又可以让其他人少走弯路.何乐而不为? ...
- 编程细节 —— 按值传递、按引用传递(final、const)
System.out,out 是 System 类内定义的静态 final PrinterStream 变量: public final class System { ... public final ...
随机推荐
- Spring的IOC注解开发入门1
基本知识点如下: 引入注解约束,配置组件扫描 类上的注解: @Conponent @Controller @Service @Repository 普通属性的注解 @value 对象属性的注解 ...
- [NOI2017]蔬菜
[NOI2017]蔬菜 题目描述 大意就是有\(n\)种物品,第\(i\)个物品有\(c_i\)个,单价是\(a_i\).然后每天你可以卖出最多\(m\)个物品.每天结束后第\(i\)种物品会减少\( ...
- SQL FULL JOIN 关键字
SQL FULL JOIN 关键字 只要其中某个表存在匹配,FULL JOIN 关键字就会返回行. FULL JOIN 关键字语法 SELECT column_name(s) FROM table_n ...
- centos7下安装docker(17.4docker监控----prometheus)
Prometheus是一个非常优秀的监控工具.准确的说,应该是监控方案.Prometheus提供了监控数据搜集,存储,处理,可视化和告警一套完整的解决方案 Prometheus架构如盗图: 官网上的原 ...
- vue.js 二维码生成组件
安装 通过NPM安装 npm install vue-qart --save 插件应用 将vue-qart引入你的应用 import VueQArt from 'vue-qart' new Vue({ ...
- hyperledge环境安装
1.安装环境 1)本机安装 前提是已经安装好了docker\docker-compose\go,相应的内容可见 docker-1-环境安装及例子实践 docker官方文档学习-1-Docker for ...
- centos7 搭建openvpn服务器
OpenVPN是一个开源代码的VPN应用程序,可让您在公共互联网上安全地创建和加入专用网络.相比pptp,openvpn更稳定.安全. 本篇博客主要介绍下面两点: 1. Centos 7下安装与配置O ...
- MyOD 代码实现
MyOD的代码实现 一.题目要求: 编写MyOD.java 用java MyOD XXX实现Linux下od -tx -tc XXX的功能 二.设计思路 OD命令详解: 因此,该题目所要实现的功能为以 ...
- 支持“xxxContext”上下文的模型已在数据库创建后发生更改。请考虑使用 Code First 迁移更新数据库
将项目的数据库连接用户及密码修改后(切换用户,用户名与原来不一样,用户下对象结构一致),报以下错误: 支持“XXXDBContext”上下文的模型已在数据库创建后发生更改.请考虑使用 Code Fir ...
- Item 22: 当使用Pimpl机制时,在实现文件中给出特殊成员函数的实现
本文翻译自<effective modern C++>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 如果你曾经同过久的编译时间斗争过,那么你肯定对Pi ...