php中传递变量默认是按照值传递。

  简单举个例子:

 <?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/>';// testObj1($p1);
echo $p1->age,'<br/>';// testObj2($p1);
echo $p1->age,'<br/>';// 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中按值传递和按引用传递的一个问题的更多相关文章

  1. Java中按值传递与按引用传递的区别

    值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响 ...

  2. 关于Java中按值传递和按引用传递的问题详解

    写了两个方法,一个是多关键字的快速排序,一个是基于多关键字的基速排序.两个方法的参数列表是一样一样的,但是快速排序正常工作,但是基数排序传出来的参数一点没有改变,苦思冥想了半天也没想通是怎么回事,于是 ...

  3. JavaScript中函数参数的按值传递与按引用传递(即按地址传递)

    首先声明一句:JavaScript中所有函数的参数都是按值传递的!不存在按引用传递! 在讲传递参数之前我们先来讲一下指针. 学过C指针的应该都知道,指针变量中保存的是一个地址,程序可以根据所保存的地址 ...

  4. PHP中对象是按值传递还是按引用传递?

    1.首先,什么是按值传递和按引用传递? 按值传递就是仅仅把值传递过去,相当于传递的是值的拷贝,而按引用传递传递的是内存的地址. 在 PHP5 中,如果按引用传递,就是将 zval 的地址赋给另一个变量 ...

  5. 关于js中一个对象当做参数传递是按值传递还是按引用传递的个人看法

    在<JavaScript高级程序设计>这本书中有这样一段话:有很多开发人员错误的认为:在局部作用域中修改的对象会在全局作用域中反映出来,就说明参数是按引用传递的.换句话说,尼古拉认为当一个 ...

  6. Java参数按值传递?按引用传递

    有时候在想,java在调用方法时候究竟是按值传递还是按引用传递,之前有人说是基本数据类型按值传递,引用类型按引用传递.一时间,似乎都有道理. 笔者在此不追究字眼上的辨别识字能力,把自己对这个问题的理解 ...

  7. js按值传递和按引用传递

    摘要:js的数据类型有种划分方式为 原始数据类型和 引用数据类型. 原始数据类型 存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置.栈区包括了 变量的标识符和变量的值. ...

  8. JS是按值传递还是按引用传递?【转载】

    最近遇到个有趣的问题:“JS中的值是按值传递,还是按引用传递呢?” 在分析这个问题之前,我们需了解什么是按值传递(call by value),什么是按引用传递(call by reference). ...

  9. Java的按值传递和按引用传递解说

    在网上看到的一个帖子解释Java的按值传递和按引用传递,感觉挺全面,就转过来,以供以后学习参考: 1:按值传递是什么 指的是在方法调用时,传递的参数是按值的拷贝传递.示例如下: public clas ...

随机推荐

  1. 【代码笔记】Web-ionic-index创建侧边栏

    一,创建侧边栏. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...

  2. Mybatis PageHelper 简单使用

    流程 1,maven 依赖 2,在 mybatis 配置文件启用插件 3,修改 service 层 依赖 <!-- https://mvnrepository.com/artifact/com. ...

  3. 根据需要扩展java中的ThreadPoolExecutor

    经常被重写的三个方法 ThreadPoolExecutor是可扩展的,通过查看源码可以发现,它提供了几个可以在子类化中改写的方法:beforeExecute,afterExecute,terminat ...

  4. python自动化开发-6-常用模块-续1

    json和pickle模块:用于序列化的模块. 序列化:我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serializatio ...

  5. NoHttp封装--02 自定义请求

    bean实体类请求: 1.bean import java.io.Serializable; import com.alibaba.fastjson.annotation.JSONField; pub ...

  6. Python之SGDRegressor

    实现: # -*- coding: UTF-8 -*- import numpy as npfrom sklearn.linear_model import SGDRegressor __author ...

  7. sqlserver序列定时初始化

    1.创建序列 2.序列初始化存储过程 create procedure proDemo as begin alter sequence dbo.序列名 restart with 0; end 3.创建 ...

  8. fedora 使用 vnc 远程 fedora 28 主机

    问题重述: 最近环境中需要使用 fedora 28 来进行远程桌面,于是就重新配置了一下vnc 在这里面做一下记录. 过程: yum 安装: 工作机上安装 vncviewer 远程主机上安装: vnc ...

  9. 查看tomcat项目中,具体占用cpu高的线程。

    1.查看主进程占用cpu高: 此处主进程:27823 ~]# top top - :0: up days, :, 3 users, load average: 13.12, 13.31, 13.23 ...

  10. PHP Excel导入数据到MySQL数据库

    数据导出已经有了,怎么能没有数据导入呢,同样使用TP5框架,首先需要下载phpexcel.zip,放到第三方类库目录vendor目录下,然后有一个页面可以让你选择要导入的Excel文件,然后点击导入按 ...