2012-10-09 68 views
0

此代碼的工作:我可以使用邏輯OR ||嗎?在PHP變量聲明?

$foo = getFoo(); 
if (!$foo) $foo = getBar(); 
if (!$foo) $foo = getJiggy(); 
if (!$foo) $foo = getWithIt(); 

我認爲我看到某處它與邏輯運算符的簡化:

$foo = (getFoo() || getBar() || getJiggy() || ...); 

我盤算了一下,第一個真正的語句會獲得通過,但相反,它是隻需將$ foo設置爲布爾型true而不是返回值getFoo(),getBar()等。

是否有像我所想的那樣的簡化?

+0

您可能正在考慮傳統的'myfunc()或die()'語句。無論如何,不​​,沒有辦法做到你想要的。 '$ foo = getFoo()|| $ foo = getBar()...'會起作用,但是,現在。 – slugonamission

+1

你究竟想要用這個糟糕的東西來解決什麼問題? :)需要有更好的方法... – walther

+1

您可能正在考慮使用'||'運算符來實現JavaScript的合併行爲。你發佈的內容非常可讀,應該保持原樣。 – zzzzBov

回答

5

對於JavaScript,foo = bar || baz;是一個常用的表達式,因爲||運算符具有合併行爲。

對於||運算符,PHP沒有這種行爲,該運算符返回一個布爾值。因此,您最初發布的詳細代碼如下:

$foo = getFoo(); 
if (!$foo) $foo = getBar(); 
if (!$foo) $foo = getJiggy(); 
if (!$foo) $foo = getWithIt(); 

是您最可讀,更可取的選項。

PHP 5.3 has a shorthand version of the ternary operator, which acts as a coalescing operator:

由於PHP 5.3,就可以離開了三元運算符的中間部分。表達式expr1?:如果expr1的計算結果爲TRUE,則expr3返回expr1,否則返回expr3。

這將允許您使用:

$foo = getFoo() ?: getBar() ?: getJiggy() ?: getWithIt(); 

但是,假設你不必擔心兼容性。

+0

+1的可讀性註釋。 –

+0

愛三元戲!感謝那。 – adamdport

0

您可以使用嵌套三元運算符。喜歡的東西:

$foo = (!$foo)? getFoo() : ((!$foo)? getBar() : getJiggy()) ; 
+1

將無法​​按預期工作:當$ foo未定義時,它將始終分配'getFoo()',否則它將分配'getJiggy()'。賦值在處理完此語句後完成:'$ foo =($ foo%2 === 0?1:($ foo%2 === 1?2:0));'will _never_將foo設置爲0。如果$ foo是偶數,則奇數時設爲1,結束時設爲2。 –

-1

嘗試

($foo = getFoo()) || ($foo = getBar()) || ($foo = getJiggy()); 
+0

這可讀性較差,不要這樣做。 – zzzzBov

+0

@zzzzBov你的意思是不易讀 – Baba

+0

@Baba,它很緊湊,而且容易想到原作者錯誤地錯過了'$ foo == getFoo()'中的第二個'='。它使得它更加不穩定,意圖表達不夠。 – zzzzBov

1

您可以嘗試

$foo = getFoo() or $foo = getBar() or $foo = getJiggy() or $foo = getWithIt(); 
var_dump($foo); 

輸出

string 'Stop Here' (length=9) 

功能用於

function getFoo() { 
    return false; 
} 

function getBar() { 
    return false; 
} 

function getJiggy() { 
    return "Stop Here"; 
} 

function getWithIt() { 
    return "Hello World"; 
} 
+1

用於回答問題。但是,我不主張這一點。原始格式更具可讀性。 –

+0

也給你+1 ..這是一個有效的論點..... @Jason McCreary – Baba

0

可以使用較弱的優先級or和建立一個條件+分配鏈是這樣的:

$foo = getFoo() 
OR $foo = getBar() 
OR $foo = getJiggy() 
OR $foo = getWithIt(); 

出於可讀性和寬鬆別人理解這樣的運營商濫用,間距是必不可少的。

0

,如果你真的要重寫代碼,你可以使用call_user_func,但它不是一個很優雅的解決方案:

$foo = false;//best declare vars before using them, to avoid warnings in strict mode 
$functions = array('getFoo', 'getBar','getJiggy','getWithIt'); 
while(!$foo && $func = array_shift($functions)) 
{ 
    $foo = call_user_func($func,null);//replace null with optional parameters 
} 

但正如你所看到的,這將是更少維護......

+0

爲什麼投票反對?我只是說這是一個選擇,而且我說這不是一個好的選擇。儘管如此,但它的一些其他答案卻沒有 –

相關問題