Анонимные функции в PHP

CoderStudio, 20.08.2023 14:53
Анонимные функции в PHP

Анонимные функции в PHP часто используются совместно с функциями высшего порядка (такими как array_map, array_filter и т.д.).

Только после того, как я недавно попал в небольшую яму с анонимными функциями, я начал серьезно изучать этот материал.

Типом данных анонимных функций является Closure.

<?php

$anonymous = function () {
    echo "Это анонимная функция";
};

print_r(get_class($anonymous)); // Closure

Анонимные функции наследуют переменные родительской области видимости с помощью ключевого слова use.

<?php

$message="Coder";

$greeting = function () use ($message) {
    echo "Привет $message\n";
};

$greeting(); // Привет Coder

Анонимные функции, наследующие переменные родительской области видимости, могут вызываться по ссылке.

<?php

$message="Coder";

$concat = function () use (&$message) {
    $message .= " Studio";
};

$concat();

print_r("$message"); // Coder Studio

Анонимные функции не могут наследовать суперглобальные переменные.

К так называемым суперглобалам относятся: $_SERVER, $_GET, $_ENV, .... и т.д.

<?php

$anonymous = function () use ($_SERVER) {
    echo "fatal error";
};

$anonymous(); // Fatal error: Cannot use auto-global as lexical variable

Если анонимная функция объявлена в классе, то ей не нужно наследовать $this, класс будет связан автоматически.

<?php

class Test
{
    public function testThis()
    {
        return function () {
            var_dump($this);
        };
    }
}

$test = new Test;
$anonymous = $test->testThis();
$anonymous(); // object(Test)#1 (0) {}

Стрелочная функция

php > $a = fn(int $x) => 5 + $x;
php > echo $a(5);
10

Стрелочная функция более компактна, чем другие, и имеет только два отличия:

  1. переменные родительской области привязываются автоматически, нет необходимости их наследовать.
  2. все параметры вызываются по значению, их нельзя модифицировать.