24 Stimmen

Kann man bei der Verwendung des ternären Operators eine Referenz übergeben?

Einfache Frage, einfacher Code. Das funktioniert:

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

Dies ist nicht der Fall:

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

Es wirft PHP Parse error: syntax error, unexpected '&' . Ist es einfach nicht möglich, bei Verwendung des bedingten Operators eine Referenz zu übergeben, und warum nicht? Was passiert auch, wenn ein Leerzeichen zwischen dem ? y & .

22voto

jgivoni Punkte 1555

Im einfachsten Fall ist dieser Ausdruck, der illegal ist;

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

kann folgendermaßen geschrieben werden:

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

In Ihrem speziellen Fall, da Sie nicht durch Referenz zuweisen, wenn die Bedingung falsch ist, scheint eine bessere Option zu sein:

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

17voto

Wrikken Punkte 66796

Einfache Antwort: Nein. Sie müssen den langen Weg mit if/else gehen. Es wäre auch selten und möglicherweise verwirrend, einmal einen Verweis und das nächste Mal einen Wert zu haben. Ich fände das intuitiver, aber ich kenne Ihren Code natürlich auch nicht:

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

Warum: keine Ahnung, wahrscheinlich hat es damit zu tun, wann der Parser etwas als Kopie eines Wertes oder als Erzeugung einer Referenz betrachtet, was auf diese Weise zum Zeitpunkt des Parsens nicht bestimmt werden kann.

3voto

Artefacto Punkte 93200

Versuchen wir es:

$x =& true?$y:$x;

Parse error: syntax error, unexpected '?', expecting T\_PAAMAYIM\_NEKUDOTAYIM in...

$x = true?&$y:&$x;

Parse error: syntax error, unexpected '&' in...

Sie sehen also, es lässt sich nicht einmal parsen. Wikken hat wahrscheinlich recht, warum es nicht erlaubt ist.

Sie können dies mit einer Funktion umgehen:

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');

gibt:

a:

(refcount=2, is_ref=1),int 4

b:

(refcount=1, is_ref=0),null

2voto

bcosca Punkte 17013

Leider können Sie das nicht.

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

0voto

Der Kommentar zu diesem Fehlerbericht könnte etwas Licht in das Problem bringen:
http://bugs.php.net/bug.php?id=53117 .

Die beiden Probleme bei dem Versuch, eine Referenz aus dem Ergebnis eines ternären Operators zuzuweisen, sind im Wesentlichen folgende:

  1. Ausdrücke können keine Referenzen liefern, und
  2. $x = (expression) keine Referenzzuweisung ist, auch wenn (expression) ein Verweis ist (was er nicht ist; siehe Punkt 1).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X