2010-01-03 12 views
123

sah ich dies heute in einigen PHP-Code:: Operator (der 'Elvis Operator') in PHP

$items = $items ?: $this->_handle->result('next', $this->_result, $this); 

Ich bin nicht vertraut mit der ?: Operator hier verwendet wird. Es sieht aus wie ein ternärer Operator, aber der Ausdruck, der ausgewertet werden soll, wenn das Prädikat wahr ist, wurde weggelassen. Was heißt das?

Antwort

237

Sie wertet den linken Operanden aus, wenn der linke Operand truthy ist, ansonsten der rechte Operand.

In Pseudo-Code,

foo = bar ?: baz; 

löst etwa

foo = bar ? bar : baz; 

oder

if (bar) { 
    foo = bar; 
} else { 
    foo = baz; 
} 

mit dem Unterschied, dass bar wird nur einmal ausgewertet werden.

Sie können dies auch nutzen ein „Self-Check“ von foo zu tun, wie im Codebeispiel demonstriert Sie auf dem Laufenden:

foo = foo ?: bar; 

Dies wird zuweisen bar-foo wenn foo ist null oder Falsey es sonst wird foo unverändert lassen.

Einige weitere Beispiele:

<?php 
    var_dump(5 ?: 0); // 5 
    var_dump(false ?: 0); // 0 
    var_dump(null ?: 'foo'); // 'foo' 
    var_dump(true ?: 123); // true 
    var_dump('rock' ?: 'roll'); // 'rock' 
?> 

By the way, ist es die Elvis operator genannt.

Elvis operator

+7

Stellen Sie sicher, dass die Variable in den Klammern vorhanden ist, oder Sie werden einen Fehler auslösen. PHP wird nicht einfach davon ausgehen, dass es einen Wert von "null" oder irgendetwas hat. Sayin ' – DanMan

+10

Was ist lustig ist, dass diese Antwort eine rekursive Schleife mit dem Wiki-Artikel bildet, die nicht vollständig erklärt, warum es den "Elvis-Operator" genannt wird. – fayerth

+0

http://emoticon.wikia.com/wiki/Elvis_Presley –

42

Siehe the docs:

Seit PHP 5.3 ist es möglich, den mittleren Teil des ternären Operator auszulassen. Ausdruck expr1 ?: expr3 gibt expr1 zurück, wenn expr1TRUE und expr3 andernfalls ergibt.

+4

Sie brauchen einen neuen doc writer, weil unweigerlich jemand fragt, was mit expr2 passiert ist. Ich dumme es einfach. –

2

Ja, das ist neu in PHP 5.3. Er gibt entweder den Wert des Testausdrucks zurück, wenn er als TRUE ausgewertet wird, oder den alternativen Wert, wenn er als FALSE ausgewertet wird.

+2

Sehr falsch/irreführend; Kein Operand muss ein boolescher Wert sein. Es kommt darauf an, ob der erste Wert * truthy * ist, nicht ob es "TRUE" ist. –

+0

@MarkAmery Erläuterung. Sollte ziemlich schwer sein, es auf diese Weise falsch zu interpretieren. – Atli

7

mit Arrays vorsichtig. Wir müssen eine Überprüfung Variable nach ? schreiben, denn:

$params = ['param1' => 'value1', 
      'param2' => 'value2', 
      'param3' => 'value3',]; 

    $param1 = isset($params['param1'])?:null; 
    $param2 = !empty($params['param2'])?:null; 
    $param3 = $params['param3']?:null; // get E_NOTICE, if $params['param3'] eq false 

    var_dump($param1,$param2,$param3); 
    true // would like to expect `value1` 
    true // would like to expect `value2` 
    param3 // properly, but problem above 

Aktualisiert

Von RFC. In der Zukunft (in PHP 7) Betreiber Null Coalesce Operator wird es tun, zum Beispiel:

$param1 = $params['param1'] ?? null; 
// Equivalent to: $param1 = isset($params['param1']) ? $params['param1'] : null; 
+1

Dies beantwortet weder die Frage, noch ist es nützlich für jemanden, der versucht zu verstehen, wann er den Elvis Operator benutzt. –

+3

@Mark Amery hmm .. Wirklich? Ist es nicht hilfreich? Hast du wirklich mit PHP gearbeitet und tausche Fälle aus, um auf Arrays mit Ternary zuzugreifen? Ok, ich änderte den Text in "Sei vorsichtig mit Arrays .." – voodoo417

+0

so Null koalesce und elvis sind gleich? –

2

Ein weiterer wichtiger Aspekt: ​​Der Elvis Operator den Zend Opcache tokenization Prozess bricht.Ich habe das auf die harte Tour gefunden! Während dies in späteren Versionen möglicherweise behoben wurde, kann ich bestätigen, dass dieses Problem in PHP 5.5.38 (mit integriertem Zend Opcache v7.0.6-dev) existiert.

Wenn Sie feststellen, dass einige Ihrer Dateien "verweigern" in Zend Opcache zwischengespeichert werden, könnte dies einer der Gründe sein ... Hoffe, das hilft!