Überblick über die PHP-Kurzschrift

Lesezeit: 7 Minuten

Benutzer-Avatar
James Simpson

Ich programmiere jetzt seit Jahren in PHP, aber ich habe nie gelernt, wie man Abkürzungen verwendet. Ich stoße von Zeit zu Zeit im Code darauf und habe Schwierigkeiten, es zu lesen, also würde ich gerne die verschiedenen Abkürzungen lernen, die für die Sprache existieren, damit ich sie lesen und anfangen kann, Zeit/Zeilen zu sparen, indem ich sie verwende, aber Ich kann anscheinend keine umfassende Übersicht über alle Kurzschriften finden.

Eine Google-Suche zeigt fast ausschließlich die Abkürzung für if/else-Anweisungen, aber ich weiß, dass es mehr als nur das geben muss.

Kurz gesagt, ich spreche von Sachen wie:

($var) ? true : false;

  • Was meinst du mit “Kurzschrift”?

    – Jakob Relkin

    31. Dezember 2010 um 0:37 Uhr

  • Das ist nicht Perl, es gibt nicht viele Abkürzungen in PHP. Kürzere und prägnantere Möglichkeiten, bestimmte Dinge zu tun? Möglicherweise. Kurzschrift? Nicht so viel. Ihr Code wird meistens kürzer, indem Sie lernen, was all die verschiedenen Funktionen tun, und eine nette finden, die das tut, was Sie wollen, oder einige davon kombinieren, um den gewünschten Effekt zu erzielen.

    – verzeihen

    31. Dezember 2010 um 0:43 Uhr


  • Jetzt in PHP 5.4: print $var ?: 'foo' wenn Sie einfach überprüfen möchten, ob der Wert wahr ist, oder eine Standardzeichenfolge von “foo” verwenden.

    – Xeoncross

    2. Oktober 2014 um 21:39 Uhr


Benutzer-Avatar
Ali

Hier sind einige der in PHP verwendeten Kurzoperatoren.

//If $y > 10, $x will say 'foo', else it'll say 'bar'
$x = ($y > 10) ? 'foo' : 'bar';

//Short way of saying <? print $foo;?>, useful in HTML templates
<?=$foo?>

//Shorthand way of doing the for loop, useful in html templates
for ($x=1; $x < 100; $x++):
   //Do something
end for;

//Shorthand way of the foreach loop
foreach ($array as $key=>$value):
   //Do something;
endforeach;

//Another way of If/else:
if ($x > 10):
    doX();
    doY();
    doZ();
else:
    doA();
    doB();
endif;

//You can also do an if statement without any brackets or colons if you only need to
//execute one statement after your if:

if ($x = 100)
   doX();
$x = 1000;

// PHP 5.4 introduced an array shorthand

$a = [1, 2, 3, 4];
$b = ['one' => 1, 'two' => 2, 'three' => 3, 'four' => 4];

  • Wie ist das alternative Syntax “Kurzschrift”? Das ist, wenn überhaupt, langwierig. Ich würde mitmachen <?= allerdings, wenn es nicht entmutigt wurde und sich auf kurze offene Tags verließ.

    – verzeihen

    31. Dezember 2010 um 0:57 Uhr


  • $x = 'xxxx'; $x && $array['new'] = $x . Was bedeutet das?

    – Serjas

    16. Dezember 2013 um 6:02 Uhr

  • $x = 'xxxx'; if($x AND ($array['news'] = $x)) { // nothing }

    – Xeoncross

    2. Oktober 2014 um 21:34 Uhr

  • $x = 'xxxx'; if('xxxx' AND 'xxxx') { // nothing }

    – Xeoncross

    2. Oktober 2014 um 21:35 Uhr

  • @deceze – in php=>5.4 <?= verlässt sich nicht auf kurze offene Tags,

    – Frazer

    19. Juni 2015 um 21:58 Uhr

Benutzer-Avatar
Felix Klinge

PHP 5.3 eingeführt:

$foo = $bar ?: $baz;

die den Wert von zuweist $bar zu $foo wenn $bar wertet zu true (anders $baz).

Sie können den ternären Operator auch verschachteln (mit der richtigen Verwendung von Klammern).

Abgesehen davon gibt es nicht viel mehr darüber. Vielleicht möchten Sie die lesen Dokumentation.

  • @Felix Wäre das mit dem zu vergleichen || Operator in JavaScript?

    – Jakob Relkin

    31. Dezember 2010 um 0:38 Uhr


  • @Jacob Relkin: Ich kann nicht sagen, ob es in jedem Fall gleich funktioniert, aber im Allgemeinen hat es die gleiche Wirkung (um ganz genau zu sein, || in JS ist || in PHP auch 😉 (es gibt nur einen booleschen Wert in PHP zurück und nicht den Wert)).

    – Felix Klinge

    31. Dezember 2010 um 0:40 Uhr


  • @Felix Ja, das habe ich mir auch gedacht. 🙂

    – Jakob Relkin

    31. Dezember 2010 um 0:41 Uhr

  • @Jacob: Verkettung funktioniert (z. B. $foo = false ?: 0 ?: 42), also denke ich, dass es genauso funktionieren würde wie JavaScript ||. Die Unterschiede können darin liegen, was PHP für falsch hält (z. B. '0').

    – Matthew

    31. Dezember 2010 um 0:47 Uhr


  • Ich habe das nicht abgelehnt, aber vielleicht wegen der booleschen Aussage $foo = $bar ist kein boolescher Wert, sondern eine Zuweisungsanweisung. Auch nach dem ? -Operator gibt es keinen Wert für die “wahre” Seite der Anweisung, nur $baz wird zurückgegeben, wenn Ihre boolesche Anweisung falsch ist.

    – Mattygabe

    15. Januar 2011 um 3:48 Uhr

Einer meiner liebsten “Tricks” in PHP ist die Verwendung der Array-Vereinigung -Operator, wenn es um Situationen wie Funktionen geht, die ein Array von Argumenten annehmen und auf Standardwerte zurückgreifen.

Betrachten Sie beispielsweise die folgende Funktion, die ein Array als Argument akzeptiert und wissen muss, dass die Schlüssel 'color', 'shape'und ‘size‘ eingestellt sind. Aber vielleicht weiß der Benutzer nicht immer, was das sein wird, also möchten Sie ihm einige Standardwerte zur Verfügung stellen.

Bei einem ersten Versuch könnte man so etwas versuchen:

function get_thing(array $thing)
{
    if (!isset($thing['color'])) {
        $thing['color'] = 'red';
    }
    if (!isset($thing['shape'])) {
        $thing['shape'] = 'circle';
    }
    if (!isset($thing['size'])) {
        $thing['size'] = 'big';
    }
    echo "Here you go, one {$thing['size']} {$thing['color']} {$thing['shape']}";
}

Die Verwendung des Array-Union-Operators kann jedoch eine gute Abkürzung sein, um dies sauberer zu machen. Betrachten Sie die folgende Funktion. Es hat genau das gleiche Verhalten wie das erste, ist aber klarer:

function get_thing_2(array $thing)
{
    $defaults = array(
        'color' => 'red',
        'shape' => 'circle',
        'size'  => 'big',
    );
    $thing += $defaults;
    echo "Here you go, one {$thing['size']} {$thing['color']} {$thing['shape']}";
}    

Eine andere lustige Sache ist Anonyme Funktionen, (und Closures, eingeführt in PHP 5.3). Um beispielsweise jedes Element eines Arrays mit zwei zu multiplizieren, könnten Sie einfach Folgendes tun:

array_walk($array, function($v) { return $v * 2; });

  • array_map kann auch verwendet werden, um dasselbe wie array_walk zu tun?

    – Ali

    31. Dezember 2010 um 0:59 Uhr

  • Sie sind sich ähnlich. array_map akzeptiert ein Array als Wert und gibt ein neues Array zurück, während array_walk ändert das Array selbst.

    – mfonda

    31. Dezember 2010 um 1:00 Uhr

  • +1, um die zufällige Ablehnung auszugleichen. Das ist ein legitimer Code. ich bevorzuge array_merge($defaults, $thing)aber Gewerkschaften sind auch in Ordnung.

    – verzeihen

    31. Dezember 2010 um 1:02 Uhr

  • +1 array_merge() und + sind unterschiedliche Funktionen für unterschiedliche Zwecke. Ich verwende beide mindestens einmal in jedem Projekt.

    – Xeoncross

    2. Oktober 2014 um 21:37 Uhr


Benutzer-Avatar
Robert Pfunder

Niemand erwähnt ??!

// Example usage for: Null Coalesce Operator
$action = $_POST['action'] ?? 'default';

// The above is identical to this if/else statement
if (isset($_POST['action'])) {
    $action = $_POST['action'];
} else {
    $action = 'default';
}

Dies nennt man die ternär operator, ein boolescher Operator mit drei Operanden:

Der erste ist der auszuwertende boolesche Ausdruck.

Der zweite ist der auszuführende Ausdruck, wenn der boolesche Ausdruck TRUE ergibt.

Der dritte ist der auszuführende Ausdruck, wenn der boolesche Ausdruck FALSE ergibt.

  • Außerdem existiert dieser Operator in den meisten Sprachen im C-Stil, nicht nur in PHP.

    – Sam Dufel

    31. Dezember 2010 um 0:39 Uhr

Benutzer-Avatar
Okonomiyaki3000

Ebenfalls neu in PHP7 ist der Raumschiffoperator. Meistens nützlich bei Rückrufen für Dinge wie usort().

Vor:

usort($list, function ($a, $b) {
    if ($a == $b) return 0;
    return $a < $b;
});

Nach:

usort($list, function ($a, $b) { return $a <=> $b; });

Grundsätzlich gibt es eine negative ganze Zahl, 0, oder eine positive ganze Zahl zurück, basierend auf dem Vergleich der linken Seite mit der rechten Seite.

  • Außerdem existiert dieser Operator in den meisten Sprachen im C-Stil, nicht nur in PHP.

    – Sam Dufel

    31. Dezember 2010 um 0:39 Uhr

Benutzer-Avatar
Mattygabe

Jacob Relkin hat also völlig recht damit, dass die von Ihnen erwähnte „Kurzschrift“ tatsächlich als „ternärer“ Operator bezeichnet wird und, wie Sam Dufel hinzufügt, in anderen Sprachen sehr verbreitet ist. Je nachdem, wie die Sprache es implementiert, kann es für den Server sogar schneller sein, die Logik zu interpretieren, und Sie können sie schneller lesen.

Was also manchmal hilft, wenn Sie eine neue Logik oder neue Operatoren wie diese lernen, ist, an das Englische (oder was auch immer Ihre Muttersprache ist) zu denken, damit es dazu passt. Beschreibe es in einem Satz. Lassen Sie uns Ihr Beispiel durchsprechen:

($var) ? true : false;

Was dies lesen sollte, ist dies:

Ist $var wahr? Wenn $var ist, gibt den Wert true zurück. Wenn $var falsch ist, gibt den Wert false zurück.

Das Fragezeichen erinnert Sie daran, dass Sie eine Frage stellen, die die Ausgabe bestimmt.

Ein häufigerer Anwendungsfall für den ternären Operator ist, wenn Sie etwas überprüfen, das nicht unbedingt ein boolescher Wert ist, aber Sie können die boolesche Logik verwenden, um es zu beschreiben. Nehmen Sie zum Beispiel das Objekt Cardas eine Eigenschaft namens hat color, das ist eine String-ähnliche Variable (in PHP). Sie können nicht fragen, ob eine Zeichenfolge wahr oder falsch ist, da dies keinen Sinn ergibt, aber Sie können verschiedene Fragen dazu stellen:

$output = $car->color == "blue" ? "Wheee this car is blue!" : "This car isn't blue at all.";

echo $output;

Diese Zeile lautet also wie folgt:

Ist die Farbe des Autos die gleiche wie die Zeichenfolge “blau”?

Wenn ja, gib den String zurück “Whee this car is blue!”Andernfalls Geben Sie die Zeichenfolge “Dieses Auto ist überhaupt nicht blau” zurück.

Was auch immer der ternäre Operator zurückgibt, wird auf der rechten Seite einer Zuweisungsanweisung mit $output verwendet, und dieser String wird dann ausgegeben.

1215470cookie-checkÜberblick über die PHP-Kurzschrift

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy