Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP5.4通过引用传递调用时间-是否可以轻松修复?_Php - Fatal编程技术网

PHP5.4通过引用传递调用时间-是否可以轻松修复?

PHP5.4通过引用传递调用时间-是否可以轻松修复?,php,Php,有没有办法轻松解决这个问题,或者我真的需要重写所有遗留代码 PHP致命错误:调用时间传递引用已在中删除。。。在线30 当变量在整个代码中作为引用传递到函数中时,这种情况随处可见。您应该在函数定义中通过引用来表示调用,而不是实际调用。由于PHP开始在5.3版中显示弃用错误,我认为重写代码是个好主意 : 函数调用上没有引用符号-仅在函数定义上。仅函数定义就足以通过引用正确传递参数。从PHP5.3.0开始,当您在foo(&$a)中使用&时,您将收到一条警告,指出“通过引用传递调用时间”是不推荐的 例如

有没有办法轻松解决这个问题,或者我真的需要重写所有遗留代码

PHP致命错误:调用时间传递引用已在中删除。。。在线30


当变量在整个代码中作为引用传递到函数中时,这种情况随处可见。

您应该在函数定义中通过引用来表示调用,而不是实际调用。由于PHP开始在5.3版中显示弃用错误,我认为重写代码是个好主意

:

函数调用上没有引用符号-仅在函数定义上。仅函数定义就足以通过引用正确传递参数。从PHP5.3.0开始,当您在
foo(&$a)中使用
&
时,您将收到一条警告,指出“通过引用传递调用时间”是不推荐的

例如,不使用:

// Wrong way!
myFunc(&$arg);               # Deprecated pass-by-reference argument
function myFunc($arg) { }
使用:


PHP和引用有些不直观。如果在正确的位置使用适当的引用,可以提供较大的性能改进,或者避免非常难看的变通方法和异常代码

以下操作将产生错误:

 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);
 function f(&$v){$v = true;}
 $v = array(false,false,false);
 $r = &$v[1];
 f($r);
这会看到您正在传递一个非引用,但需要一个引用,因此会将其转换为引用

这意味着,如果函数没有明确要求引用,那么就不能将引用传递给函数,使其成为PHP严格传递类型的少数几个领域之一,或者在本例中,它更像是元类型

如果您需要更动态的行为,这将起作用:

 function f(&$v){$v = true;}
 f($v);
 function f(&$v){$v = true;}
 $v = array(false,false,false);
 $r = &$v[1];
 f($r);

在这里,它看到您想要一个引用,并且已经有了一个引用,所以不必理会它。它也可能会链接引用,但我对此表示怀疑。

对于像我这样的人来说,阅读本文是因为他们需要将一个巨大的遗留项目更新为5.6:正如这里的答案所指出的,没有快速修复方法:你真的需要手动查找每次出现的问题,并修复它

我发现查找项目中所有有问题的行的最方便的方法(除了使用完整的静态代码分析器,它非常准确,但我不知道有什么能立即将您带到编辑器中的正确位置)是使用Visual Studio代码,它内置了一个很好的PHP linter,它的搜索功能允许通过正则表达式进行搜索。(当然,您可以使用任何IDE/代码编辑器进行PHP linting和Regex搜索。)

使用此正则表达式:

^(?!.*function).*(\&\$)
可以在项目范围内搜索
和$
的出现情况,但只能在非函数定义的行中搜索

这仍然会出现很多误报,但它确实使工作更容易


VSCode的搜索结果浏览器使浏览和查找有问题的行变得非常容易:您只需单击每个结果,并注意那些在过梁上加上红色下划线的行。您需要修复的错误。

弃用是从PHP 5.0.0开始的,当时给出了
E_COMPILE_警告
级别错误,以供参考:我有此错误,但需要删除&而不是添加到变量中。我在名为event(&$event)的对象的旧代码中使用了此选项,为了让错误信息消失,我不得不删除符号。在我作为开发人员的所有岁月中,我实际上从未需要在php上使用过。从来没有。这正是我要找的。很好对于评论中的人,请注意,删除&可能会导致意外的结果,因为对变量的任何更改将不再共享,而只对函数本地范围可见。因此,除非您知道代码的作用,否则我建议您按照上面所述修复它,而不是删除&characterRelated:这就是我要找的!我使用的更精确的正则表达式:
(?][a-zA-Z0-9_100;]+(?只需使用phpcs,就会为您挖掘出所有包含该正则表达式的文件。