2017-07-16 222 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()讲述了一个非常准确的输出结果。