如何解决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警告和用于此目的的预期语法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。