2009-10-08 45 views
20

在一些語言中,你可以做PHP中是否存在返回最左邊值的短路?

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

也就是說,由左到右,直到它找到一個真值或將短路,只有評估值。但是,除此之外,它返回的已評估的實際值,而不僅僅是true

在上述例子中,在PHP,$a將是價值1如果任$a$b是非假值,否則會die

所以寫了一個函數first,以用作

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

它返回值要麼$a$b。但是,它不會短路 - 它始終是die

PHP中是否存在短路OR返回實際值?

編輯: 一些很好的答案,因爲我給的例子,但我想我的例子不正是我的意思。讓我澄清一下。

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

各地方對這些功能做了真的很激烈計算的,所以我只想最多一次評估每一個表情。首先要返回一個真實值,我想將實際值存儲在$a中。

我想我們可以排除寫一個函數,因爲它不會短路。而條件運算符的答案會評估每個表達式兩次。

+2

這當然總是會死的。當你調用一個函數時,PHP必須首先評估所有的參數。在評估過程中,它看到'死亡'(「沒有價值」),就是這樣。 – Tom 2009-10-08 17:16:40

+1

當我們談論變量時,評估每個表達式兩次都很好。你必須在第一時間提出你的問題,而不是在提出第一次不可用的額外信息後批評答案。如果你的意思是功能,第一次使用功能。最好的答案是現在混亂的「號碼」 – 2009-10-08 17:54:37

+1

評論#2是錯誤的。 php有短路評估,但AFAIK不會返回最左邊的值。它總是返回一個布爾值。 – apinstein 2012-01-02 14:04:16

回答

10

只需使用:

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

還是我失去了一些東西?

+0

不是我正在尋找的東西,但它很乾淨,它的工作原理。謝謝。 – Steve 2009-10-08 18:24:57

+16

對於「乾淨」的充分骯髒的價值。 – chaos 2009-10-08 19:06:34

+3

我會upvote的答案,但它會很好,如果我可以downvote語言 – 2015-05-05 00:41:27

28

不,在我看來,這是Rasmus Lerdorf在設計PHP時做出的最糟糕的決定之一,它最容易讓拙劣的開發人員爲了溺愛不稱職的開發人員而h PHP不前。

編輯:在PHP 5.3以上,你可以寫$a = $b ?: $c,甚至$a = $b ?: $c ?: $d。仍然不如沒有大腦損壞的邏輯運算符那麼好,但它是某種東西。

+3

?:語法是,恕我直言,完全不可讀。短路本來會好得多,甚至沒有可比性:/ – 2010-04-26 18:33:40

+6

先生,你不會發現我的任何爭執。 – chaos 2010-04-26 20:07:02

2

你可以使用某種coalesce function

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

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

這並不完全等同於一套正常工作的邏輯運算符(它不允許複雜的表達式或函數調用被短路,當然它有更多的開銷),但它是某種東西。 – chaos 2009-10-08 17:24:00

+1

這很好,但會評估每個參數以便合併,而不像真正的短路OR。例如,coalesce(true,launch_missiles())或死亡(「結束就近」)仍然會導致導彈啓動。 – Shawn 2009-10-08 17:28:39

1

什麼可變的功能呢?

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

這應該工作:

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

我很抱歉,但大部分答案都只是關閉。

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

成爲

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

的原因還是不工作是不是不是返回前面或者後面的值返回true或false。

相關問題