2017-07-16 223 views
2

下面是一個傳統的PHP應用程序,有人可以解釋這裏發生了什麼,或者是什麼一般術語是在這條線後面,所以我可以研究它。主要是我很困惑關於? $foo : !$foo這裏使用的preg_match概念是什麼?

preg_match("/^test_item_([0-9]*)/", $foo, $item) ? $foo : !$foo 
+1

如果'$ foo'字符串匹配模式 - 返回此字符串。否則返回'!$ foo' –

+1

它與'if'和'else'相同以返回結果 –

+2

關鍵字:三元 –

回答

3

如果$foo它返回的是模式匹配。否則它會被否定,因爲!

這意味着一些不同的事情,具體取決於$foo的實際內容。

這些是可能的:

$foo是 「falsy」,例如。 null,false, ''它返回true。在任何其他情況下,它將返回false

例子:

$foo = 'test_item_1'; // leads to 'test_item_1' 
$foo = 'test_item'; // leads to false 
$foo = '';   // leads to true 

這是很可怕的行爲,你應該做的意圖更加清晰。

+0

優秀,清晰和樂於助人,非常感謝。也知道它不是最好的(最清晰的)代碼是最有洞察力的。 – mayersdesign

1

?先於真正條件的輸出,該:先於條件的輸出。

當嘗試處理&顯示布爾值時,很多人都會混淆不清。下面是一個使用demoechovar_export()顯示速記條件的輸出:

$foo='test_item_1'; 
var_export(preg_match("/^test_item_([0-9]*)/", $foo, $item)?$foo:!$foo); 
echo "\n"; 
echo preg_match("/^test_item_([0-9]*)/", $foo, $item)?$foo:!$foo; 

echo "\n\n---\n\n"; 

$foo='failing string'; 
var_export(preg_match("/^test_item_([0-9]*)/", $foo, $item)?$foo:!$foo); 
echo "\n"; 
echo preg_match("/^test_item_([0-9]*)/", $foo, $item)?$foo:!$foo; 


echo "\n\n---\n\n"; 

$foo=''; 
var_export(preg_match("/^test_item_([0-9]*)/", $foo, $item)?$foo:!$foo); 
echo "\n"; 
echo preg_match("/^test_item_([0-9]*)/", $foo, $item)?$foo:!$foo; 

輸出:

'test_item_1' 
test_item_1  // the string as expected 

--- 

false 
       // print empty string 

--- 

true 
1    // converts true to 1 

正如你可以看到,使用echo將有可能導致混亂。 var_export()講述了一個非常準確的輸出結果。