PHP 7.4 enthält Pfeilfunktionen (Kurznotation anonymer Funktionen)

Die Abstimmung über die abgekürzte Syntax für die Funktionen ist abgeschlossen (51 Stimmen, 8 Gegenstimmen).


Es war:


$result = array_filter($paths, function ($v) use ($names) { return in_array($v, $names); }); 

Es wurde:


 $result = array_filter($paths, fn($v) => in_array($v, $names)); 

Details unter dem Schnitt


Die neue Syntax lautet:


Syntax


 fn(_) => _ 

In der Signatur einer Pfeilfunktion können Sie wie in einer regulären Funktion Typen, Standardeinstellungen usw. angeben.


 fn(array $x) => $x; fn(): int => $x; fn($x = 42) => $x; fn(&$x) => $x; fn&($x) => $x; fn($x, ...$rest) => $rest; 

Achtung! Ein neues Schlüsselwort fn , was Rückwärtsinkompatibilität bedeutet!


Andere (verworfene) Syntaxideen


Überlegte Optionen:


  //  ,        ($x) => $x * $y //   ,     ,     { ($x) => $x + $y } //     Hack;       ($x) ==> $x * $y // ,      ($x) -> $x * $y //      $x-- > $x*$y $x --> $x * $y //    Rust,    |$x| => $x * $y 

und einige andere


Variablen schließen


Wichtig! Im Gegensatz zu früheren Versionen von PHP, in denen es erforderlich war, sperrbare Variablen explizit mit dem Operator use festzulegen, schließt die Pfeilfunktion implizit die gesamte übergeordnete Skala für sich.


Hier sind die entsprechenden Einträge:


 $y = 1; $fn1 = fn($x) => $x + $y; $fn2 = function ($x) use ($y) { return $x + $y; }; 

Die Variable $ this wird wie jede andere Variable geschlossen. Wenn dies ein unerwünschtes Verhalten ist, können Sie es mit dem statischen Schlüsselwort deaktivieren.


 class Test { public function method() { $fn = fn() => var_dump($this); $fn(); // object(Test)#1 { ... } $fn = static fn() => var_dump($this); $fn(); // Error: Using $this when not in object context } } 

Das Schließen von Variablen in Pfeilfunktionen erfolgt nach Wert (im Gegensatz zur Sprache Go beispielsweise). Das heißt, Durch Ändern von Variablen innerhalb einer Funktion wird die Variable im übergeordneten Bereich nicht geändert.


Schlussfolgerungen


Der Code ist viel kompakter geworden, und obwohl er nicht so kompakt ist wie in Javascript und einigen anderen Sprachen, ist das Schreiben dennoch viel angenehmer:


 $result = Collection::from([1, 2]) ->map(fn($v) => $v * 2) ->reduce(fn($tmp, $v) => $tmp + $v, 0); echo $result; //6 

Im Gegensatz zu einigen anderen Sprachen unterstützen Pfeilfunktionen in PHP nicht mehrere Anweisungen, die durch ein Zeichen getrennt sind ; , weil dies (laut den Autoren des RFC) der Idee einer Kurzschrift-Syntax widerspricht. Vielleicht wird dies in Zukunft überarbeitet.


Wir werden die Pfeilfunktionen in PHP auf jeden Fall im Zinc Prod- Podcast ausführlich besprechen. Abonnieren Sie sie also unbedingt.


RFC-Link

Source: https://habr.com/ru/post/de450544/


All Articles