加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP函数数组参数通过引用

发布时间:2020-12-13 21:46:24 所属栏目:PHP教程 来源:网络整理
导读:为什么这段代码不能按预期工作? 在Test( $array)函数内部,我将ref参数设置为全局$array1,但这不起作用. $array1 = array();$array2 = array();function Test($array){ global $array1; $array = $array1; $array['inside'] = 'inside';} //由功能设定: Tes
为什么这段代码不能按预期工作?
在Test(& $array)函数内部,我将ref参数设置为全局$array1,但这不起作用.

$array1 = array();
$array2 = array();

function Test(&$array)
{
    global    $array1;
    $array = &$array1;

    $array['inside'] = 'inside';

}

//由功能设定:

Test($array2); 
$array2['test1'] = 'test1';

var_dump($array1); //array('inside' => 'inside') ** WHERE IS THE 'test1'  key? **
var_dump($array2); //array('test1' => 'test1')   ** WHERE IS THE 'inside' key? **

//没有功能的设置:

$array2 = &$array1;
$array2['test2'] = 'test2';

var_dump($array1); //array('inside' => 'inside','test2' => 'test2') ** FINE **
var_dump($array2); //array('inside' => 'inside','test2' => 'test2') ** FINE **

编辑:

很明显,如果我将$array更改为指向$array1,那么$array1将具有’inside’=>函数外的’inside’值.有什么不清楚,如果我设置$array2 [‘test1’] =’test1’为什么不更改这个$array1呢?它在功能内部’链接’!

解决方法

这是我对PHP中的引用的理解,以及为什么代码没有达到预期的效果(如果我弄错了,有人请跳过我,我经常使用引用!还有,我确信有比我更好的术语我正在呼叫“标识符”和“价值”;我只是想避免在任何一个概念中使用“变量”.)

>有一堆变量标识符(您获取数据的方式)和一堆变量值(实际上数据的位置)
>对于普通变量,只有一个标识符指向一个值.例如$foo指的是一个特定的值 – 在PHP内部的某个地方可以存放一个数字,一个字符串等等
>每次使用常规赋值运算符时,例如$foo = 42,PHP查找指向的值并更新它 – 因此标识符$foo没有改变,但它指向的值有.
>分配参考时,例如$bar =& $foo,你实际上是在告诉PHP改变标识符本身.所以现在$bar和$foo是指向相同值的两个不同的标识符. $foo = -1和$bar = -2都会写入这个值,无论你给它什么名字,你都指的是那个值.
>到目前为止,这么好.但是,如果我现在写$foo =& $鲍勃?由于我正在更改标识符,而不是值,$foo开始指向与$bob相同的值,但$bar保持原样.所以现在,改变$foo将不再对$bar产生任何影响.
>通过引用函数传入参数时会发生类似的事情.所以在问题的例子中,测试行($array2)仍然在名为$array的函数中创建一个新的标识符,但它将它指向与$array2相同的值.但是,函数内部是$array =& $array1,它接受新标识符($array)并将其指向与$array1相同的值. $array2仍然指向的旧值没有改变.
>还有其他情况也是如此.例如,全局和静态关键字创建指向现有值的额外标识符.如果你写函数foo(){global $foo; $bar = 2; $foo =& $酒吧; },只更新函数的名为$foo的本地标识符,指向$bar的值;全局标识符(当您处于全局范围时,也恰好称为$foo)仍??然指向其原始值.

PHP中普通值的参考系统总是包含一个间接级别 – 例如,您无法以C中的方式创建指向指针的指针.

唯一棘手的情况是对象,它在许多语言中都有自己的额外级别的间接 – 而$foo = 42; $bar = $foo;将表示42的数据从$foo的值复制到$bar,$foo = new stdClass; $bar = $foo复制一个对象指针.因此,虽然$foo和$bar仍然有单独的值,并且$foo = 42这样的赋值对$bar没有任何影响,$foo-> a = 1;和$bar-> a = 1将最终改变同一个对象.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读