2017-07-16 1 views
2

Das Folgende ist in einer älteren PHP-App, könnte jemand bitte erklären, was hier passiert, oder was die allgemeine Terminologie hinter der Linie ist, damit ich es erforschen kann. Meistens ich über ? $foo : !$fooWas ist das preg_match-Konzept hier?

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

Wenn "$ foo" Zeichenfolge Muster entspricht - geben Sie diese Zeichenfolge zurück. Sonst return '! $ Foo' –

+1

es ist dasselbe wie ein' if' und 'else', um das Ergebnis zurückzugeben –

+2

Stichwort: ternär –

Antwort

3

Wenn $foo das Muster es wie zurückgegeben wird Spiele bin verwirrt. Ansonsten wird es negiert, wegen der !.

Das bedeutet ein paar verschiedene Dinge, abhängig vom tatsächlichen Inhalt von $foo.

Dies ist möglich:

$foo "falsy" ist, zum Beispiel. null, false, '' gibt es true zurück. In jedem anderen Fall gibt es false zurück.

Beispiel:

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

Das ist ganz schrecklich Verhalten, sollten Sie die Absicht viel klarer.

+0

Ausgezeichnet, klar und hilfreich, vielen Dank. Auch zu wissen, dass es nicht der beste (klarste) Code ist, ist am aufschlussreichsten. – mayersdesign

1

Die ? geht die wahren Ausgang der Bedingung, die : die Ausgabe falsch Zustandes des vorausgeht.

Viele Leute werden verwirrt, wenn sie versuchen, & Boolesche Werte zu verarbeiten. Hier ist ein demoecho und var_export() mit der Stenographie bedingten Ausgängen anzuzeigen:

$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; 

Ausgang:

'test_item_1' 
test_item_1  // the string as expected 

--- 

false 
       // print empty string 

--- 

true 
1    // converts true to 1 

Wie Sie sehen können, echo verwendet, wird wahrscheinlich zu Verwirrung führen. var_export() erzählt eine sehr genaue Geschichte der Ausgabe.