php中按值传递和按引用传递的一个问题
2016-03-05 14:39
615 查看
php中传递变量默认是按照值传递。
简单举个例子:
如果testArray的参数写成$arr,那么数组$array的结果不会变。证明是按照值传递。
如果参数强制改成引用传递,函数参数要写成&$arr,结果才是Array ( [0] => 1 [1] => 2 [2] => 3 )
再举一个对象的例子:
对象也依然是按照值传递。这个值是栈区的地址。
有人会说,为什么按照值传递,28行还会是2。
如果用个堆栈模型演示一下就很明白了,$p1这个变量是存在栈区,它存放了一块地址,这块地址指向了堆区里的对象。
此时调用了testObj1()函数,那么会在函数栈里面,再生成一个$p变量,它也存放了一块地址,这个地址和$p1存放的地址相同,表示$p也指向堆区的那个位置。所以说改变$p堆的对象属性,$p1也跟着变。
当调用testObj2()函数时,它让函数栈区的$p指向了空,但是它并没有改变$p1的指向,$p1仍然指向的那块堆地址。所以仍然是2。
当调用testObj3()函数时,函数取的是$p1的地址(注意区别,$p1本身在栈里是有个地址的,它存放的数据也是个地址,这两个地址是不一样的),直接操纵了$p1,表示让$p1指向空。因此$p1也就没有了属性值。
简单举个例子:
<?php function testArray($arr){// &$arr $arr = array(1,2,3,); } $array = array(4, 5); testArray($array); print_r($array);// Array ( [0] => 4 [1] => 5 )
如果testArray的参数写成$arr,那么数组$array的结果不会变。证明是按照值传递。
如果参数强制改成引用传递,函数参数要写成&$arr,结果才是Array ( [0] => 1 [1] => 2 [2] => 3 )
再举一个对象的例子:
<?php class Person{ public $age = 0; function __construct($age) { $this->age = $age; } } function testObj1($p){ $p->age = 2; } function testObj2($p){ $p = null; } function testObj3(&$p){ $p = null; } $p1 = new Person(1); echo $p1->age,'<br/>';// 1 testObj1($p1); echo $p1->age,'<br/>';// 2 testObj2($p1); echo $p1->age,'<br/>';// 2 testObj3($p1); echo $p1->age,'<br/>';// null
对象也依然是按照值传递。这个值是栈区的地址。
有人会说,为什么按照值传递,28行还会是2。
如果用个堆栈模型演示一下就很明白了,$p1这个变量是存在栈区,它存放了一块地址,这块地址指向了堆区里的对象。
此时调用了testObj1()函数,那么会在函数栈里面,再生成一个$p变量,它也存放了一块地址,这个地址和$p1存放的地址相同,表示$p也指向堆区的那个位置。所以说改变$p堆的对象属性,$p1也跟着变。
当调用testObj2()函数时,它让函数栈区的$p指向了空,但是它并没有改变$p1的指向,$p1仍然指向的那块堆地址。所以仍然是2。
当调用testObj3()函数时,函数取的是$p1的地址(注意区别,$p1本身在栈里是有个地址的,它存放的数据也是个地址,这两个地址是不一样的),直接操纵了$p1,表示让$p1指向空。因此$p1也就没有了属性值。
相关文章推荐
- PHP与Web服务器的链接原理 涉及 php-fpm原理
- PHP - 直接输出对象的版本问题
- PHP中不同编码的汉字占的字节数不同gbk,GBK,UTF-8,utf-8
- 我见过最好的vsftpd配置教程(转)
- PHP中不同编码的汉字占的字节数不同gbk,GBK,UTF-8,utf-8
- VSFTP服务详解
- php 长整型转字符串 (convert long to string)
- PHP 批量移动文件改名
- CI框架的一些笔记
- 原生PHP编码问题解决思路:信源、信道、信宿
- 使用基于ThinkPHP3.2.3的ThinkAdmin创建手机电脑通用的表白墙(二)自动判断设备以显示不同界面
- Windows系统下Yaf框架的安装
- 使用基于ThinkPHP3.2.3的ThinkAdmin创建手机电脑通用的表白墙(一)创建项目文件夹结构
- Zend Framework动作助手Redirector用法实例详解
- Zend Framework动作助手Url用法详解
- Zend Framework动作助手Json用法实例分析
- 关于yii2里面的\yii\helpers\Url组件
- TP 模板中截取字符串
- php中mysqli_errno和mysqli_error的区别
- (9) PHP 随笔---Smarty模板引擎 已有模板和Smarty结合 11