Подтвердить что ты не робот

Можете ли вы пройти по ссылке при использовании тернарного оператора?

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

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

Это не означает:

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

можно записать следующим образом:

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

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

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

Ответ 3

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

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

Ответ 4

Попробуйте:

$x =& true?$y:$x;
Parse error: syntax error, unexpected '?', expecting T_PAAMAYIM_NEKUDOTAYIM in...
$x = true?&$y:&$x;
Parse error: syntax error, unexpected '&' in...

Итак, вы видите, он даже не разбирает. Викен, вероятно, прав, почему он не разрешен.

Вы можете обойти это с помощью функции:

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:

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

Ответ 5

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

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

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