【问题标题】:Can you pass by reference while using the ternary operator?使用三元运算符时可以通过引用传递吗?
【发布时间】:2021-10-04 18:36:26
【问题描述】:

简单的问题,简单的代码。这有效:

$x = &$_SESSION['foo'];

这不是:

$x = (isset($_SESSION['foo']))?&$_SESSION['foo']:false;

它抛出PHP Parse error: syntax error, unexpected '&'。使用条件运算符时是否不能通过引用传递,为什么不呢?如果?& 之间有空格,也会发生这种情况。

【问题讨论】:

  • 哪个 PHP 版本? AFAIU,您可以使用 PHP 5.3:$x = &($_SESSION['foo']) ?: false;
  • 对不起,我不小心把它剪掉了; 5.2.8,可悲的是。
  • @Milan 如果 $_SESSION['foo'] 元素不存在,则会触发 E_NOTICE

标签: php ternary-operator


【解决方案1】:

对此错误报告的评论可能会对该问题有所帮助:
http://bugs.php.net/bug.php?id=53117

本质上,尝试从三元运算符的结果中分配引用的两个问题是:

  1. 表达式不能产生引用,并且
  2. $x = (expression) 不是引用分配,即使 (expression) 是引用(它不是;参见第 1 点)。

【讨论】:

    【解决方案2】:

    在非常简单的情况下,这个表达式是非法的;

    $c = condition ? &$a : &$b; // Syntax error
    

    可以这样写:

    $c = &${ condition ? 'a' : 'b' };
    

    在您的具体情况下,如果条件为假,您不会通过引用进行分配,因此更好的选择似乎是:

    $x = isset($_SESSION['foo']) ? $x = &$_SESSION['foo'] : false;
    

    【讨论】:

    【解决方案3】:

    让我们试试吧:

    $x =& true?$y:$x;
    
    解析错误:语法错误,意外的“?”,期待 T_PAAMAYIM_NEKUDOTAYIM 在...
    $x = true?&$y:&$x;
    
    解析错误:语法错误,意外的 '&' in...

    所以,你看,它甚至没有解析。 Wikken 对于为什么不允许这样做可能是正确的。

    你可以用一个函数来解决这个问题:

    function &ternaryRef($cond, &$iftrue, &$iffalse=NULL) {
        if ($cond)
            return $iftrue;
        else
            return $iffalse;
    }
    
    $x = 4;
    $a = &ternaryRef(true, $x);
    xdebug_debug_zval('a');
    $b = &ternaryRef(false, $x);
    xdebug_debug_zval('b');
    

    给出:

    一个:

    (refcount=2, is_ref=1),int 4
    
    b:
    (refcount=1, is_ref=0),null
    

    【讨论】:

      【解决方案4】:

      很遗憾,你不能。

      $x=false;
      if (isset($_SESSION['foo']))
         $x=&$_SESSION['foo'];
      

      【讨论】:

        【解决方案5】:

        简单的回答:不。如果/其他,你将不得不采取很长的路要走。一次有一个引用,而下一次有一个值,这也是很少见的,并且可能会令人困惑。我会觉得这更直观,但是我当然不知道你的代码:

        if(!isset($_SESSION['foo'])) $_SESSION['foo'] = false;
        $x = &$_SESSION['foo'];
        

        至于为什么:不知道,可能解析器必须在什么时候认为某物是价值的副本或引用的创建,以这种方式无法在解析时确定。

        【讨论】:

        • 正如PHP documentation 所说:Note: Please note that the ternary operator is a statement, and that it doesn't evaluate to a variable, but to the result of a statement. This is important to know if you want to return a variable by reference.
        猜你喜欢
        • 1970-01-01
        • 2022-01-25
        • 2018-12-18
        • 2016-08-22
        • 2015-04-27
        • 2016-05-15
        • 2023-02-16
        • 1970-01-01
        相关资源
        最近更新 更多