PHP7:通过引用传递非变量有什么不好,为什么传递函数时会发出通知,而传递数组时会出现致命错误?

PHP7:通过引用传递非变量有什么不好,为什么传递函数时会发出通知,而传递数组时会出现致命错误?,php,pass-by-reference,fatal-error,php-7,Php,Pass By Reference,Fatal Error,Php 7,我有以下代码: $family = cis_resempty(wp_get_post_terms($post->ID,'family'),0); 我得到以下错误: 注意:在中只有变量应该通过引用传递 第18行的C:\xampp…..xxx.php 如果我这样做: $family = cis_resempty(array('a'),0); 我甚至 致命错误:中只能通过引用传递变量 第16行的C:\xampp…xxx.php 函数cis_resempty如下所示(但它来自库): 发现如果我

我有以下代码:

$family = cis_resempty(wp_get_post_terms($post->ID,'family'),0);
我得到以下错误:

注意:在中只有变量应该通过引用传递 第18行的C:\xampp…..xxx.php

如果我这样做:

$family = cis_resempty(array('a'),0);
我甚至

致命错误:中只能通过引用传递变量 第16行的C:\xampp…xxx.php

函数cis_resempty如下所示(但它来自库):

发现如果我在cis_resempty的参数列表中删除了
参考符号,则没有错误

如果我这样做:

$family = @cis_resempty(wp_get_post_terms($post->ID,'family'),0);
$family = @cis_resempty(array('a'),0);
没有通知,一切正常-但Netbeans说:

错误控制操作员的滥用

但如果我这样做:

$family = @cis_resempty(wp_get_post_terms($post->ID,'family'),0);
$family = @cis_resempty(array('a'),0);
致命错误仍然存在

为什么我可以通过引用传递函数,并使用错误控制操作符抑制通知,但如果传递数组,则会出现致命错误


为什么通过引用传递非变量是不好的?

注意:从不使用
'@'
进行抑制

为什么我可以通过引用传递函数并使用 错误控制运算符,但如果传递数组,则会出现致命错误

请阅读这里的第一条注释:

函数调用上没有引用符号-仅在函数定义上。仅函数定义就足以通过引用正确传递参数。从PHP5.3.0开始,当您使用&in-foo(&$a);,您将收到一条警告,指出“调用时间按引用传递”是不推荐的;。从PHP5.4.0开始,通过引用传递调用时间已被删除,因此使用它将引发致命错误

PHP不“支持”它,因为5.4.0=>在任何情况下都会得到
E_FATAL
。带
@
或不带
@
。对于函数-您得到
E\u STRICT
。好吧然后,阅读有关
@
的更多信息。请再次注意,第一点:

注意:@-运算符仅适用于表达式。一个简单的经验法则是:如果你可以获取某个东西的值,你可以在它前面加上@operator。例如,您可以将其前置到变量、函数和include调用、常量等。不能将其前置到函数或类定义,或if和foreach等条件结构

尝试此代码(它将显示):

术语“非变量”指程序员不能通过名称引用的任何变量。这些是执行器在运行时分配的临时变量:函数调用的结果或其他未分配给命名变量的表达式

只有当通过引用传递的变量被命名时,通过引用传递某个变量才有意义,这样当调用结束时,调用方可以访问通过引用传递给被调用方的变量

当PHP在编译时遇到函数调用时,会保留函数调用结果的空间和函数调用的参数,然后在执行时相对于执行帧进行分配。当您通过引用传递函数调用的结果时,执行器能够强制变量通过引用的行为,因为堆上有空间,它可以忽略变量没有名称。。。这样做通常没有意义,但出于向后兼容性的原因仍然存在

当PHP在编译时遇到一个文本(数组)时,它会为数据分配相对于op数组(函数)本身的空间。由于这种差异,引用文字的引用行为将是危险的,并导致非常意外的行为:考虑当函数被重新输入、并发或以其他方式发生时会发生什么。