2009-10-08 7 views
20

In manchen Sprachen können SieGibt es einen Kurzschluss OR in PHP, der den Wert ganz links zurückgibt?

$a = $b OR $c OR die("no value");

tun, das ist, wird die ODER Kurzschluss, nur Werte Auswertung von links nach rechts, bis er einen wahren Wert findet. Aber zusätzlich gibt es den tatsächlichen Wert, der ausgewertet wurde, im Gegensatz zu nur true.

Im obigen Beispiel, in PHP, wird $a1 der Wert sein, wenn entweder $a$b oder nicht-falsche Werte sind, oder es wird die.

schrieb also eine Funktion first, wie

$a = first($a, $b, die("no value"));

, die den Wert zurückgibt verwendet werden von beiden $a oder $b. Aber es schließt nicht kurz - es wird immer die.

Gibt es einen Kurzschluss OR in PHP, der den tatsächlichen Wert zurückgibt?

Edit: Einige gute Antworten für das Beispiel, das ich gab, aber ich denke, mein Beispiel nicht genau das, was ich meinte. Lass mich das klären.

$a = func1() OR func2() OR func3();

Wo jede dieser Funktionen hat eine wirklich sehr intensiv Berechnung, so möchte ich nur jeden Ausdruck höchstens einmal bewerten. Und für den ersten, der einen wahren Wert zurückgibt, möchte ich, dass der tatsächliche Wert in $a gespeichert wird.

Ich denke, wir können das Schreiben einer Funktion ausschließen, weil es nicht kurzschließen wird. Und die Antwort des bedingten Operators wertet jeden Ausdruck zweimal aus.

+2

Dies wird natürlich immer sterben. Wenn Sie eine Funktion aufrufen, muss PHP zuerst alle Parameter auswerten. Während der Auswertung sieht er "sterben" ("no value") und tut genau das. – Tom

+1

Es war in Ordnung, jeden Ausdruck zweimal auszuwerten, wenn wir über Variablen sprachen. Sie müssen Ihre Frage beim ersten Mal formulieren und nicht eine Antwort kritisieren, nachdem Sie zusätzliche Informationen präsentiert haben, die beim ersten Mal nicht verfügbar waren. Wenn Sie Funktionen gemeint haben, verwenden Sie Funktionen zum ersten Mal. Die beste Antwort ist jetzt Chaos "Nein" –

+1

Kommentar # 2 ist falsch. php hat eine Kurzschlussauswertung, aber AFAIK liefert nicht das am weitesten links liegende Vale. Es gibt immer einen booleschen Wert zurück. – apinstein

Antwort

10

Sie können mit nur:

$a = func1() or $a = func2() or $a = func3(); 

oder ich etwas fehle?

+0

Nicht genau was ich suchte, aber es ist sauber und es funktioniert. Vielen Dank. – Steve

+16

Für ausreichend schmutzige Werte von "sauber". – chaos

+3

Ich werde die Antwort verbessern, aber es wäre nett, wenn ich die Sprache runterziehen könnte –

28

Nein, es gibt nicht, und das ist meiner Meinung nach eine der schlechten Entscheidungen, die Rasmus Lerdorf bei der Entwicklung von PHP getroffen hat, dass die meisten Entwickler humpeln, um unfähige zu verhätscheln.

Edit: In PHP 5.3 und höher können Sie schreiben $a = $b ?: $c und sogar $a = $b ?: $c ?: $d. Immer noch nicht so gut wie nicht-hirngeschädigte logische Operatoren, aber es ist etwas.

+3

?: Syntax ist, IMHO, völlig unlesbar. Kurzschlüsse wären so viel besser gewesen, es ist nicht einmal vergleichbar:/ –

+6

Sie werden von mir keine Argumente finden, Sir. – chaos

2

Sie könnten eine Art von coalesce function verwenden:

function coalesce() { 
    foreach (func_get_args() as $arg) { 
     if ($arg) { 
      return $arg; 
     } 
    } 
    return null; 
} 

$a = coalesce($a, $b) or die("no value"); 
+0

Dies ist nicht vollständig äquivalent zu einer richtig funktionierenden Gruppe von logischen Operatoren (komplexe Ausdrücke oder Funktionsaufrufe können nicht kurzgeschlossen werden, und natürlich hat es viel mehr Overhead), aber es ist etwas. – chaos

+1

Dies ist nett, aber wird jedes der Argumente zu koaleszieren, im Gegensatz zu einem echten Kurzschluss OR. Zum Beispiel, koaleszieren (wahr, launch_missiles()) oder sterben ("das Ende ist in der Nähe") wird immer noch Raketen zum Start bringen. – Shawn

1

Was variable Funktionen?

function coalesce($funcs) 
{ 
    foreach ($funcs as $func) 
    { 
     //Catch language constructs 
     switch($func) 
     { 
      case 'die': 
       die(); 
     } 
     $result = $func(); 
     if ($result) 
     { 
      return $result; 
     } 
    } 
} 
0

sollte diese Arbeit:

$a = (($f1=func1()) ? $f1 : ($f2=func2()) ? $f2 : func3())); 
1

Es tut mir leid, aber die meisten dieser Antwort ausgeschaltet sind gerade.

$ a = $ b ODER $ c ODER sterben ("kein Wert");

wird

$a = $b ?: $c ?: die("no value"); 

Der Grund oder nicht funktioniert ist, dass anstelle anstelle der früheren oder letztere Wert der Rückkehr wahr oder falsch es zurückgibt.