387 Stimmen

?: Operator (der 'Elvis-Operator') in PHP

Ich habe das heute in einem PHP-Code gesehen:

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

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

9 Stimmen

Ich kannte den Namen 'Elvis' nicht. +1 für das hier.

772voto

BalusC Punkte 1034465

Er wertet den linken Operanden aus, wenn der linke Operand wahrheitsgemäß und andernfalls der rechte Operand.

In Pseudocode,

foo = bar ?: baz;

löst sich in etwa auf

foo = bar ? bar : baz;

ou

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

mit dem Unterschied, dass bar wird nur einmal ausgewertet.

Sie können damit auch eine "Selbstkontrolle" durchführen foo wie in dem von Ihnen geposteten Codebeispiel gezeigt:

foo = foo ?: bar;

Dadurch wird die bar a foo wenn foo null oder falsch ist, sonst bleibt foo unverändert.

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'
?>

Übrigens, es heißt die Elvis Betreiber .

Elvis operator

71voto

Yacoby Punkte 52756

Véase die Dokumente :

Seit PHP 5.3 ist es möglich, den mittleren Teil des ternären Operators wegzulassen. Ausdruck expr1 ?: expr3 devuelve expr1 wenn expr1 wertet aus zu TRUE y expr3 sonst.

31voto

voodoo417 Punkte 11530

Seien Sie vorsichtig mit Arrays. Wir müssen eine Prüfvariable nach ? , 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 PHP 7 ist der Operator Null-Koaleszenz-Operator wird es zum Beispiel tun:

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

19voto

Willem van der Veen Punkte 26043

Elvis Betreiber:

?: ist der Elvis-Operator. Dies ist ein Binäroperator die folgendes tut:

Erzwingt den Wert links von ?: in einen booleschen Wert um und prüft, ob er true . Wenn true wird der Ausdruck auf der linken Seite zurückgegeben, bei false wird der Ausdruck auf der rechten Seite zurückgegeben.

Ejemplo:

var_dump(0 ?: "Expression not true");     // expression returns: Expression not true
var_dump("" ?: "Expression not true");    // expression returns: Expression not true
var_dump("hi" ?: "Expression not true");  // expression returns string hi
var_dump(null ?: "Expression not true");  // expression returns: Expression not true
var_dump(56 ?: "Expression not true");    // expression return int 56

Wann zu verwenden:

Der Elvis-Operator ist im Grunde eine Kurzschreibweise für einen speziellen Fall des ternären Operators, nämlich:

$testedVar ? $testedVar : $otherVar;

Der Elvis-Operator macht die Syntax auf folgende Weise konsistenter:

$testedVar ?: $otherVar;

10voto

Prasad Paradkar Punkte 116

Eine weitere wichtige Überlegung: Der Elvis Operator unterbricht den Zend Opcache Tokenisierungsprozess. Ich habe das auf die harte Tour herausgefunden! Auch wenn dies in späteren Versionen behoben wurde, kann ich bestätigen, dass dieses Problem in PHP 5.5.38 (mit eingebautem Zend Opcache v7.0.6-dev) besteht.

Wenn Sie feststellen, dass einige Ihrer Dateien sich weigern, im Zend Opcache gecached zu werden, kann dies einer der Gründe sein... Hoffentlich hilft das!

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