Resumo : neste tutorial, você aprenderá sobre as funções anônimas do PHP e como usá-las de forma eficaz.
Introdução às funções anônimas
Ao definir uma função , você especifica um nome para ela. Mais tarde, você pode chamar a função pelo seu nome.
Por exemplo, para definir uma função que multiplica dois números, você pode fazer o seguinte:
<?php
function multiply($x, $y)
{
return $x * $y;
}
Linguagem de código: HTML, XML ( xml )
A multiply()
função aceita dois argumentos e retorna o resultado. Para chamar a multiply()
função, você passa os argumentos para ela assim:
<?php
multiply(10, 20);
Linguagem de código: HTML, XML ( xml )
Neste exemplo, the multiply()
é uma função nomeada. E você pode reutilizá-lo quantas vezes quiser.
Além de funções nomeadas, o PHP permite definir funções anônimas.
Uma função anônima é uma função que não possui nome.
O exemplo a seguir define uma função anônima que multiplica dois números:
<?php
function ($x, $y) {
return $x * $y;
};
Linguagem de código: HTML, XML ( xml )
Como a função não tem nome, você precisa finalizá-la com ponto e vírgula ( ;
) porque o PHP a trata como uma expressão.
Esta função anônima não é útil porque você não pode usá-la como uma função nomeada.
Para usar uma função anônima, você precisa atribuí-la a uma variável e chamar a função por meio da variável.
O exemplo a seguir atribui a função anônima à $multiply
variável:
<?php
// ...
$multiply = function ($x, $y) {
return $x * $y;
};
Linguagem de código: HTML, XML ( xml )
E isso chama a função anônima através da $multiply
variável:
echo $multiply(10, 20);
Linguagem de código: PHP ( php )
Ao despejar as informações da $multiply
variável, você verá que na verdade é um Clousure
objeto:
object(Closure)#1 (1) {
["parameter"]=> array(2) {
["$x"]=>string(10) "<required>"
["$y"]=>string(10) "<required>"
}
}
Linguagem de código: PHP ( php )
Observe que o encerramento Closure
em PHP não é o mesmo que o fechamento em outras linguagens de programação, como JavaScript ou Python .
Como uma função anônima é um objeto, você pode atribuí-la a uma variável , passá-la para uma função e retorná-la de uma função.
Passando uma função anônima para outra função
O PHP possui muitas funções integradas que aceitam uma função de retorno de chamada, por exemplo, a array_map()
função.
A array_map()
função aceita uma função de retorno de chamada e um array. Aplica a função de retorno de chamada a cada elemento e inclui os resultados em um novo array.
O exemplo a seguir mostra como duplicar cada número em uma matriz:
<?php
function double_it($element)
{
return $element * 2;
}
$list = [10, 20, 30];
$double_list = array_map(double_it, $list);
print_r($double_list);
Linguagem de código: HTML, XML ( xml )
Como funciona.
- Primeiro, defina uma função nomeada chamada
double_it
para duplicar um número. - Segundo, defina uma matriz de inteiros.
- Terceiro, chame a
array_map()
função para duplicar cada elemento do$list
array. - Finalmente, mostre a matriz de resultados.
Saída:
Array
(
[0] => 20
[1] => 40
[2] => 60
)
Linguagem de código: PHP ( php )
Este exemplo funciona perfeitamente bem. No entanto, é bastante detalhado. E a double_it
função pode ser usada uma vez.
O exemplo a seguir faz o mesmo, mas usa uma função anônima:
<?php
$list = [10, 20, 30];
$results = array_map(function ($element) {
return $element * 2;
}, $list);
print_r($results);
Linguagem de código: HTML, XML ( xml )
Escopo da função anônima
Por padrão, uma função anônima não pode acessar as variáveis do seu escopo pai . Por exemplo:
<?php
$message = 'Hi';
$say = function () {
echo $message;
};
$say();
Linguagem de código: HTML, XML ( xml )
PHP emitiu o seguinte aviso:
PHP Notice: Undefined variable: message in ...
Linguagem de código: texto simples ( texto simples )
Neste exemplo, a função anônima tenta acessar a $message
variável de seu escopo pai. No entanto, não poderia. Portanto, o PHP emitiu um aviso.
Para usar as variáveis do escopo pai dentro de uma função anônima, coloque as variáveis na use
construção da seguinte maneira:
<?php
$message = 'Hi';
$say = function () use ($message) {
echo $message;
};
$say();
Linguagem de código: HTML, XML ( xml )
Agora, deve funcionar corretamente.
Observe que the $message
é passado para a função anônima por valor, não por referência. Se você alterá-lo dentro da função anônima, a alteração não será refletida fora da função. Por exemplo:
<?php
$message = 'Hi';
$say = function () use ($message) {
$message = 'Hello';
echo $message;
};
$say();
echo $message;
Linguagem de código: HTML, XML ( xml )
Neste exemplo, dentro da função anônima, o valor de $message
is 'Hello'
. No entanto, fora da função anônima, o valor da mensagem permanece o mesmo que 'Hi'
.
Se você deseja passar uma variável para uma função anônima por referência, você precisa usar o &
operador como no exemplo a seguir:
<?php
$message = 'Hi';
$say = function () use ($message) {
$message = 'Hello';
echo $message;
};
$say();
echo $message;
Linguagem de código: HTML, XML ( xml )
Agora, você vê as 'Hello'
mensagens duas vezes.
Retornar uma função anônima de uma função
O exemplo a seguir ilustra como retornar uma função anônima de uma função:
<?php
function multiplier($x)
{
return function ($y) use ($x) {
return $x * $y;
};
}
$double = multiplier(2);
echo $double(100); // 200
$tripple = multiplier(3);
echo $tripple(100); // 300
Linguagem de código: HTML, XML ( xml )
Como funciona.
- Primeiro, defina uma função chamada
mutiplier
que retorne uma função anônima. - Segundo, chame a
multiplier
função e atribua o valor retornado à$double
variável. Como o valor de retorno é uma função, ele pode ser invocado como uma função normal ($double(2)
). - Terceiro, chame a função multiplicadora e atribua o valor retornado à
$tripple
variável. Desta vez passamos por 3 em vez de 2.
Resumo
- Uma função anônima é uma função sem nome.
- Uma função anônima é um objeto Closure.
- Para acessar as variáveis do escopo pai dentro de uma função anônima, coloque as variáveis na
use
construção. - Uma função anônima pode ser atribuída a uma variável, passada para uma função ou retornada de uma função.