Можете ли вы пройти по ссылке при использовании троичного оператора? - PullRequest
23 голосов
/ 02 августа 2010

Простой вопрос, простой код.Это работает:

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

Это не:

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

Это бросает PHP Parse error: syntax error, unexpected '&'.Разве невозможно передать по ссылке при использовании условного оператора, и почему нет?Также происходит, если между ? и &.

есть пробел.

Ответы [ 5 ]

17 голосов
/ 02 февраля 2011

В самом простом случае это выражение, которое недопустимо;

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

можно записать так:

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

В вашем конкретном случае, поскольку вы не присваиваете по ссылке, если условие ложно, лучше выбрать вариант:

$x = isset($_SESSION['foo']) ? $x = &$_SESSION['foo'] : false;
16 голосов
/ 02 августа 2010

Простой ответ: нет.Вам придется пройти долгий путь с if / else.Также было бы редким и, возможно, сбивающим с толку иметь ссылку один раз и значение в следующий.Я бы нашел это более интуитивно понятным, но, опять же, я, конечно, не знаю ваш код:

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

Что касается того, почему: не знаю, вероятно, это связано с тем, в какой момент парсер считает что-токопия значения или создание ссылки, которая таким образом не может быть определена в момент разбора.

2 голосов
/ 02 августа 2010

Давайте попробуем:

$x =& true?$y:$x;
Parse error: syntax error, unexpected '?', expecting T_PAAMAYIM_NEKUDOTAYIM in...
$x = true?&$y:&$x;
Parse error: syntax error, unexpected '&' 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');

дает:

a:

<i>(refcount=2, is_ref=1)</i>,int 4
б:
<i>(refcount=1, is_ref=0)</i>,null
2 голосов
/ 02 августа 2010

К сожалению, вы не можете.

$x=false;
if (isset($_SESSION['foo']))
   $x=&$_SESSION['foo'];
0 голосов
/ 19 мая 2011

Комментарий к этому сообщению об ошибке может пролить свет на проблему:
http://bugs.php.net/bug.php?id=53117.

По сути, две проблемы с попыткой присвоить ссылку из результата троичного оператора:

  1. Выражения не могут давать ссылки, а
  2. $x = (expression) не является справочным присвоением, даже если (expression) является справочным (что не является; см. Пункт 1).
...