我正在将代码库从PHP 5.3升级到PHP 5.6。
我正在修复我的代码库中通过引用传递调用时间的事件,如PHP手册页http://www.php.net/manual/en/language.references.pass.php中所述:
注意:函数调用上没有引用符号 - 仅在函数上 定义。单独的函数定义足以正确传递 参考的论点。从PHP 5.3.0开始,您将收到警告 当你使用& amp;时,不推荐使用“call-time pass-by-reference” 在foo(& $ a);.从PHP 5.4.0开始,调用时传递引用 删除,因此使用它会引发致命错误。
我有一些这样的功能:
function some_function($a, $b)
{
...
}
并且有时会调用此函数:
some_function($a, $b);
和其他时间使用现在已弃用的调用时间传递引用功能调用:
some_function(&$a, &$a);
所以我无法将函数签名更新为:
function some_function(&$a, &$b)
{
...
}
因为这会影响不想通过引用调用它的调用者。
所以我尝试创建一个对应该通过引用传递的变量的引用,并传递引用:
例如,重构来自:
的调用some_function(&$a, &$a);
要:
$refToA = &$a;
$refToB = &$b;
some_function($refToA, $refToB);
但是上面没有用,似乎PHP仍然在函数内部复制它们。
所以只是想知道我是否有其他选择,除了有两个版本的函数,一个通过引用获取args,另一个通过复制获取它们?
答案 0 :(得分:2)
只需以不同方式调用该函数:
参考:
some_function( $a, $b );
按价值:
$copy_a = $a;
$copy_b = $b;
some_function( $copy_a, $copy_b );
并始终使用引用函数。但是当传递副本时,函数不会改变真正的$ a和$ b。
function some_function( &$a, &$b )
{
...
}
出于好奇,你有时想通过ref和其他时间的价值来做什么功能?似乎应该是两个不同的功能。
答案 1 :(得分:0)
首先,确定更常见的用法,比如说是#34;参考"。
如果是,请将some_function
重构为
function some_function(&$a, &$b) { ... }
然后添加新功能
function some_function_byval($a, $b) { return some_function($a, $b); }
并使用"按值"更改所有通话功能使用新的。
新功能的作用很简单,因为它会将对参数副本的引用传递给原始函数。