PHP数组和传递引用

问题描述

| 在PHP中以前可能使用以下模式:
function foo($arr)
{
    // modify $arr in some way
    return $arr;
}
然后可以使用传递值调用此方法:
$arr = array(1,2,3);
$newarr = foo($arr);
或通过引用:
$arr = array(1,3);
foo(&$arr);
但是“不推荐使用呼叫时间传递”。修改功能签名:
function foo(&$arr)
将处理按引用传递情况,但由于不再可能传递值,因此将破坏原始函数的双重用途。 有没有办法解决?     

解决方法

我认为这与您所获得的接近:
function foo(&$bar) { ... }

foo($array);                // call by reference
$bar = foo($_tmp = $array); // call by value
不幸的是,这将需要对每个呼叫进行一些更改。     ,双重用途的性质是愚蠢的,这就是为什么不赞成使用该行为的原因。根据您的建议修改功能签名。     ,可悲的是,我不相信有办法解决。 只需使您的函数使用带有
&
的引用即可。     ,一个简单的解决方法是准备包装函数:
function foo($arr) {
    return foo_ref($arr);
}

function foo_ref(&$arr) {
    ...
然后,根据当前使用情况,如果要在适当的位置修改数组,则调用普通的
foo()
foo_ref()
。 还有一个常见的
array(&$wrap)
参数作弊,但这似乎不适用于您的情况。一个更现代的解决方法将是这个棘手的把戏:
// pass by value
foo($array);

// pass by reference (implicitly due to being an object)
foo($array = new ArrayObject($array));
这样可以将类似的引用传递给未准备好的函数。我个人更希望保留E_DEPRECATED警告和用于此目的的预期语法。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...