代码之家  ›  专栏  ›  技术社区  ›  Blackbam

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

  •  -1
  • Blackbam  · 技术社区  · 8 年前

    $family = cis_resempty(wp_get_post_terms($post->ID,'family'),0);
    

    我得到以下错误:

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

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

    我甚至

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

    function cis_resempty(&$var,$key) { ... }
    

    发现如果我删除 & cis\u resempty参数列表中的参考符号没有错误。

    $family = @cis_resempty(wp_get_post_terms($post->ID,'family'),0);
    

    没有通知,一切正常——但Netbeans说:

    但如果我这样做:

    $family = @cis_resempty(array('a'),0);
    

    致命错误仍然存在。

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

    2 回复  |  直到 8 年前
        1
  •  3
  •   voodoo417    8 年前

    注: 从不 '@' 用于抑制。

    在此处阅读 Passing by Reference 第一个注意事项:

    ,因此使用它将引发致命错误。

    PHP不“支持”它,因为5.4.0=>你得到 E_FATAL @ 或没有 @ E_STRICT 好吧然后,阅读 Error Control Operators .同样,第一个注意:

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

    试试这个代码(它会有帮助):

     error_reporting(E_ALL);
    
     $arr = [1,2,3,4,5,];
    
     $a_closure = function(){
         return [1,2,3,4,5];
     };
    
     function a(){
        return [1,2,3,4,5];
     }
    
     function ref_func(&$input){
        foreach($input as &$in){
            $in++;
        }
     }
    
     ref_func($a);          // @ref_func($a); 
     ref_func(a());         // @ref_func($a()); 
     ref_func($a_closure);  // @ref_func($a_closure);
     // Fatals in both
     ref_func([1,2,3,4,5]); // @ref_func([1,2,3,4,5]);
    
        2
  •  2
  •   Joe Watkins    8 年前

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

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