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 ...
随机推荐
- Beta冲刺博客汇总(麻瓜制造者)
Beta冲刺博客 Beta冲刺(1/5)(麻瓜制造者) Beta冲刺(2/5)(麻瓜制造者) Beta冲刺(3/5)(麻瓜制造者) Beta冲刺(4/5)(麻瓜制造者) Beta冲刺(5/5)(麻瓜制 ...
- excel数据表透视操作
虽然作为开发人员,很少用到office,但是在工作的时候,特别是做财务模块,或多或少都会用到excel处理数据,对比数据.比如说vlookup函数,数据透视表这些.vlookup函数我用得很熟练,但数 ...
- Hibernate知识点总结(一)
前言:学习的过程在于不断的总结与思考,这里记下笔者在学习过程中,所遇到的知识点,增加对框架掌握的熟悉程度. 1.环境的搭建 通过maven可以轻松搭建hibernate的环境. <propert ...
- 【CQOI2011】放棋子
[CQOI2011]放棋子 在一个n行m列的棋盘里放一些彩色的棋子,使得每个格子最多放一个棋子,且不同颜色的棋子不能在同一行或者同一列.有多少种方法? 例如\(,n=m=3\),有两个白棋子和一个灰棋 ...
- [CQOI2018]解锁屏幕
嘟嘟嘟 这题感觉真的很简单-- \(O(n ^ 2 logn)\)的做法特别好理解,但得开O2. 看数据范围,肯定是状压dp.但刚开始我没想通状压啥,因为点与点之间还有顺序问题.但后来发现这个顺序是子 ...
- 003_python内置的@staticmethod详解
python中的staticmethod 主要是方便将外部函数集成到类体中,美化代码结构,重点在不需要类实例化的情况下调用方法(类似java的静态方法) 如果你去掉staticmethod,在方法中加 ...
- pytorch例子学习——TRANSFER LEARNING TUTORIAL
参考:https://pytorch.org/tutorials/beginner/transfer_learning_tutorial.html 以下是两种主要的迁移学习场景 微调convnet : ...
- Ubuntu16.04之Solr7.7.1环境搭建
Solr的版本一直都在变化(比如之前我在博客园写的关于Linux安装solr,那个solr为7.6版本,此时已经不在了).大家可以去这个地址下载对应的版本:http://mirror.bit.edu. ...
- jupyter notebook安装纪要
本次教程使用python工具pip安装.更多安装方式请参考官网. 1.升级pip工具到最新 2.运行安装执行 pip install jupyter 3.安装中 4.更改工作目录 4.1获取配置文件路 ...
- 初学Python——线程
什么是线程? 线程是进程内的独立的运行线路,是操作系统能够进行运算调度的最小单位,同时也是处理器调度的最小单位.线程被包含在进程之内,是进程中实际运作单位. 一个线程指的是进程中的一个单一顺序的控制流 ...