• 技术文章 >后端开发 >PHP问题

    php数组是不是引用类型

    青灯夜游青灯夜游2022-09-20 19:08:59原创376

    php数组不是引用类型,而是值类型;数组赋值时会创建不同的变量(副本),因此修改另一个变量,并不会影响到数组本身。且PHP数组传递是值传递;在调用函数时通过将PHP数组作为实参赋给形参,在函数中修改,并不会影响到数组本身,说明此过程中的传递是值传递,数组变量并非指向此数组本身的引用。

    php入门到就业线上直播课:进入学习

    本教程操作环境:windows7系统、PHP8.1版、DELL G3电脑

    在PHP中,大部分变量类型,如字符串,整型,浮点,数组等都是值类型的,而类和对象是引用类型,在使用的时候,需要注意这一点。

    PHP的变量在内存中是这样存储的,变量保存的并不直接是值的内容,而是地址。例如:

    $a = 1;

    我们看起来,似乎变量$a直接存储了 1 这个值。而实际情况是,PHP解释器创建了变量$a,将值:1 存入内存中的某个地方,再将值的地址存到变量$a中。

    需要取值时,先找到变量$a中的地址,再根据地址找到变量的值。

    往下看:

    echo $a;

    会输出1,PHP解释器会这样完成这一样代码:找到$a中存储的地址,根据地址找到存在内存某个地方的值,输出到屏幕。

    看似一行简单的代码,流程却是这样的。

    再往下看:

    $a = 1;
    $b = &$a;

    这里的变量$b 做了一个有趣的操作,&符号取出了$a变量中存储的地址,并存储到$b变量。

    那么,如果使用下面代码:

    echo $b;

    结果也将是输出1,PHP解释器先取出$b中存储的地址,再根据地址找到值。如果我们做下面的操作:

    $a = 2;
    echo $b; //输出2

    会发现改变$a的值,$b也跟着变了。其实反过来,改变$b的值,$a的值也会跟这变。

    到这一步,我们可以确定,变量$a和$b存储了相同的地址,指向的值是一样的。

    那么,我们可以得出结论:它们表示的是同一个变量。

    进一步总结,可以得出:如果两个变量存储了相同的地址,它们就是同一个变量。

    了解了着一些内容,我们开始介绍值类型和引用类型。

    我们先看下面的代码:

    $a = 1;
    $b = $a;
    $a = 2;
    echo $b; //输出 1

    将$a的值赋给$b,改变$a的值后,$b的值依然不变,也就是说$a和$b是两个不同的变量,指向不同的地址。这种赋值时会创建不同的变量的形式我们称之为值类型。

    再看:

    class User{
     public $name = ‘Tome‘;
    }
    $a = new User;
    $b = $a;
    $a->name = ‘Jim‘;
    echo $b->name; //输出 Jim

    同样将$a的值赋给$b,改变$a后,$b也跟着变了,也就是说$a和$b是同一个变量,指向相同的地址。这种赋值时不会创建新的变量的形式我们称之为引用类型。

    php数组 值类型

    PHP中数组传递是值传递而非引用传递。

    在调用函数时通过将PHP数组作为实参赋给形参,在函数中修改,并不会影响到数组本身。

    说明此过程中的传递为值传递,数组变量并非是指向此数组本身的引用,PHP数组本身以值的形式存在,同时形参是对数组的拷贝。

    这点与其他一些语言不同(如c、Js等)很不相同,值得注意!

    示例如下:

    $arr = array(
        'name' => 'corn',
        'age' => '24',
    );
    test_arr($arr);
    function test_arr($arr){
        $arr['name'] = 'qqyumidi';
    }
    print_r($arr); //result: Array ( [name] => corn [age] => 24 )

    js代码如下:

    var arr = new Array('corn', '24');
    test_arr(arr);
    function test_arr(arr){
        arr[0] = 'qqyumidi';
    }
    console.log(arr);  //result:["qqyumidi", "24"]

    如果需要对PHP中的值传递使用引用传递效果,可以在形参前面加上取地址符&。

    $aa = 100;
    test_vars($aa);
    function test_vars(&$aa){
        $aa = 200;
    }
    print_r($aa);   //result: 200

    推荐学习:《PHP视频教程

    以上就是php数组是不是引用类型的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    专题推荐:php php数组
    上一篇:php二维数组中怎么检测子数组元素是否存在 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• PHP数组中唯一标识是啥• php数组怎么去除数字元素• php数组合并保留全部元素可以吗• php数组的元素类型必须一样吗• php数组键名能省略吗
    1/1

    PHP中文网