En soldaki değer döndüren bir kısa devre VEYA PHP var mı?

5 Cevap php

Bazı dillerde, yapabilirsiniz

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

Yani, OR olacak kısa devre, gerçek bir değeri buluncaya kadar sadece soldan sağa doğru değerleri değerlendirilmesi. Ancak ek olarak, sadece true karşı değerlendirilmiştir the gerçek değeri verir.

Yukarıdaki örnekte, PHP, $a değeri olacaktır 1 if ya $a veya $b non-yanlış değerler, veya o olacak die.

Bu yüzden olarak kullanılmak üzere bir işlev first, yazıldı

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

value ya $a ya da döndürür $b. Ancak, kısa devre değil - bu olacak zaman die.

Is there a short-circuit OR gerçek değerini döndürür PHP?

Edit: Some good answers for the example I gave, but I guess my example isn't exactly what I meant. Let me clarify.

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

Bu fonksiyonların her bir really really intense hesaplama yapar, bu yüzden sadece en bir kez, her ifadeyi değerlendirmek istediğiniz yere. Ve gerçek bir değer dönmek için ilk kez, ben gerçek değeri $a saklanabilir istiyorum.

Çünkü olmaz kısa devre I, biz bir işlevi yazma ekarte düşünüyorum. Ve koşullu operatör cevabı iki kez ifade değerlendirmek olacaktır.

5 Cevap

Sadece kullanabilirsiniz:

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

ya da ben bir şey eksik?

Hayır, yok, ve bu, benim görüşüme göre, Rasmus Lerdorf beceriksiz olanları coddling uğruna en yetkin geliştiriciler hobbles PHP tasarlanırken yapılan kötü kararlardan biridir.

Düzenleme: PHP 5.3 ve yukarı $a = $b ?: $c yazabilir ve hatta $a = $b ?: $c ?: $d. Hala kadar olmayan beyin hasarlı mantıksal operatörler olarak iyi, ama bir şey var.

Ne değişken işlevler hakkında?

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

Bu çalışması gerekir:

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