Π‘ΡΡΠ΅Π»ΠΎΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ
Π‘ΡΡΠ΅Π»ΠΎΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠΎΡΠ²ΠΈΠ»ΠΈΡΡ Π² PHP 7.4 ΠΊΠ°ΠΊ
Π»Π°ΠΊΠΎΠ½ΠΈΡΠ½ΡΠΉ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π΄Π»Ρ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡΡ
ΡΡΠ½ΠΊΡΠΈΠΉ.
Π Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡΠ΅, ΠΈ ΡΡΡΠ΅Π»ΠΎΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ
ΡΠ΅ΡΠ΅Π· ΠΊΠ»Π°ΡΡ Closure.
ΠΠ°Π·ΠΎΠ²Π°Ρ ΡΠΎΡΠΌΠ° Π·Π°ΠΏΠΈΡΠΈ ΡΡΡΠ΅Π»ΠΎΡΠ½ΡΡ
ΡΡΠ½ΠΊΡΠΈΠΉ:
fn (argument_list) => expr.
Π‘ΡΡΠ΅Π»ΠΎΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠ°ΠΊ ΠΆΠ΅,
ΠΊΠ°ΠΊ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ,
Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌ
ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ ΡΡΡΠ΅Π»ΠΎΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠΎΠ»ΡΡΠ°ΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ.
ΠΠΎΠ³Π΄Π° ΡΡΡΠ΅Π»ΠΎΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ,
ΠΊΠΎΡΠΎΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ»ΠΈ Π² ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ,
ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π½Π΅ΡΠ²Π½ΠΎ Π·Π°Ρ
Π²Π°ΡΡΠ²Π°Π΅ΡΡΡ ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ.
Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ $fn1
ΠΈ $fn2 Π²Π΅Π΄ΡΡ ΡΠ΅Π±Ρ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ.
ΠΡΠΈΠΌΠ΅Ρ #1
Π‘ΡΡΠ΅Π»ΠΎΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π°Ρ
Π²Π°ΡΡΠ²Π°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ
<?php
$y = 1;
$fn1 = fn($x) => $x + $y;
// ΠΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ $y ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ:
$fn2 = function ($x) use ($y) {
return $x + $y;
};
var_export($fn1(3));
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°:
ΠΡΠΎ ΡΠ°ΠΊΠΆΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π²ΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΡ
ΡΡΡΠ΅Π»ΠΎΡΠ½ΡΡ
ΡΡΠ½ΠΊΡΠΈΡΡ
:
ΠΡΠΈΠΌΠ΅Ρ #2
Π‘ΡΡΠ΅Π»ΠΎΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π°Ρ
Π²Π°ΡΡΠ²Π°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ,
Π΄Π°ΠΆΠ΅ ΠΊΠΎΠ³Π΄Π° ΡΡΠ½ΠΊΡΠΈΠΈ Π²Π»ΠΎΠΆΠ΅Π½Ρ
<?php
$z = 1;
$fn = fn($x) => fn($y) => $x * $y + $z;
// ΠΡΠ²Π΅Π΄Π΅Ρ 51
var_export($fn(5)(10));
ΠΠ°ΠΊ ΠΈ Π² Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡΡ
ΡΡΠ½ΠΊΡΠΈΡΡ
,
ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ ΡΡΡΠ΅Π»ΠΎΡΠ½ΡΡ
ΡΡΠ½ΠΊΡΠΈΠΉ Π΄ΠΎΠΏΡΡΠΊΠ°Π΅Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠ΅ ΡΠΈΠ³Π½Π°ΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ,
Π²ΠΊΠ»ΡΡΠ°Ρ ΡΠΈΠΏΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΡ
Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ, Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ,
ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΈ Π²ΠΎΠ·Π²ΡΠ°Ρ ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅.
ΠΠΎΡΡΠ΅ΠΊΡΠ½ΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ ΡΡΡΠ΅Π»ΠΎΡΠ½ΡΡ
ΡΡΠ½ΠΊΡΠΈΠΉ:
ΠΡΠΈΠΌΠ΅Ρ #3 ΠΡΠΈΠΌΠ΅ΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΡΡΠ΅Π»ΠΎΡΠ½ΡΡ
ΡΡΠ½ΠΊΡΠΈΠΉ
<?php
fn(array $x) => $x;
static fn($x): int => $x;
fn($x = 42) => $x;
fn(&$x) => $x;
fn&($x) => $x;
fn($x, ...$rest) => $rest;
Π‘ΡΡΠ΅Π»ΠΎΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΡΠΈΠ²ΡΠ·ΡΠ²Π°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ.
ΠΡΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ use($x)
Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ $x, Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΡΡΠ΅Π»ΠΎΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ
Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π²Π½ΡΡΡΠΈ.
ΠΡΠΈΠ²ΡΠ·ΠΊΠ° ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π²Π½ΡΡΡΠΈ ΡΡΡΠ΅Π»ΠΎΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ
ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈΠ· Π²Π½Π΅ΡΠ½Π΅ΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ.
ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ Π΄Π»Ρ ΠΏΡΠΈΠ²ΡΠ·ΠΎΠΊ ΠΏΠΎ ΡΡΡΠ»ΠΊΠ°ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ
Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ.
ΠΡΠΈΠΌΠ΅Ρ #4
Π‘ΡΡΠ΅Π»ΠΎΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π΅ ΡΠΌΠ΅ΡΡ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈΠ· Π²Π½Π΅ΡΠ½Π΅ΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ
<?php
$x = 1;
$fn = fn() => $x++; // Π€ΡΠ½ΠΊΡΠΈΡ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ
$fn();
var_export($x); // Π€ΡΠ½ΠΊΡΠΈΡ Π²ΡΠ²Π΅Π΄Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ 1
Π‘ΠΏΠΈΡΠΎΠΊ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ