有没有简单的方法来解决这个问题,或者我真的需要重写所有旧代码吗?
PHP致命错误:在第30行已删除了按引用传递调用时间
这种情况在整个代码中到处发生,因为变量被作为引用传递到函数中。
有没有简单的方法来解决这个问题,或者我真的需要重写所有旧代码吗?
PHP致命错误:在第30行已删除了按引用传递调用时间
这种情况在整个代码中到处发生,因为变量被作为引用传递到函数中。
根据文档:
在函数调用时不需要使用引用符号——只需要在函数定义中使用即可。仅函数定义就足以正确地通过引用传递参数。自PHP 5.3.0起,当您在
foo(&$a);
中使用&
时,将获得警告提示“call-time pass-by-reference”已被弃用。
例如,不要使用以下语句:
// Wrong way!
myFunc(&$arg); # Deprecated pass-by-reference argument
function myFunc($arg) { }
使用:
// Right way!
myFunc($var); # pass-by-value argument
function myFunc(&$arg) { }
E_COMPILE_WARNING
错误等级的错误。参考链接:http://www.php.net/manual/en/ini.core.php#ini.allow-call-time-pass-reference - hakre^(?!.*function).*(\&\$)
可以在整个项目中搜索&$
出现的位置,但只限于非函数定义的行。
这仍然会有很多误报,但可以使工作变得更容易。
VSCode的搜索结果浏览器使得查找有问题的行变得超级简单:您只需点击每个结果并寻找由语法检查器用红色下划线标记的内容。这些需要修复。
(?<!function)[:> ][a-zA-Z0-9_]+(?<!foreach|array)\s?\([^()]*&\$
。 - MojoPHP和引用有点不直观。如果在正确的地方适当使用引用,可以提供大量的性能改进或避免非常丑陋的解决方法和不寻常的代码。
以下代码将产生错误:
function f(&$v){$v = true;}
f(&$v);
function f($v){$v = true;}
f(&$v);
这些都不需要失败,因为它们可以遵循以下规则,但毫无疑问已被移除或禁用,以防止大量的旧代码混淆。
如果它们确实起作用,两者都涉及冗余转换为引用,第二个还涉及冗余转换回范围内包含变量。
第二种曾经是可能的,允许将引用传递给不打算使用引用的代码。这对于可维护性来说非常丑陋。
这将不会有任何作用:
function f($v){$v = true;}
$r = &$v;
f($r);
function f(&$v){$v = true;}
f($v);
这意味着您正在传递一个非引用参数,但想要一个引用参数,因此将其转换为引用参数。
这意味着您不能将引用参数传递给不明确要求引用参数的函数,这是PHP在传递类型方面严格的少数领域之一,或者更准确地说是元类型。
如果您需要更多动态行为,则可以使用以下方法:
function f(&$v){$v = true;}
$v = array(false,false,false);
$r = &$v[1];
f($r);
在这里,它看到你需要一个引用并且已经有了一个引用,所以不做任何更改。它可能会链接这个引用,但我怀疑这种情况。