Funções anônimas de PHP

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 à $multiplyvariá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 $multiplyvariável:

echo $multiply(10, 20);Linguagem de código:  PHP  ( php )

Ao despejar as informações da $multiplyvariável, você verá que na verdade é um Clousureobjeto:

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 Closureem 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_itpara duplicar um número.
  • Segundo, defina uma matriz de inteiros.
  • Terceiro, chame a array_map()função para duplicar cada elemento do $listarray.
  • 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_itfunçã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 $messagevariá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 useconstruçã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 $messageis '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); // 300Linguagem de código:  HTML, XML  ( xml )

Como funciona.

  • Primeiro, defina uma função chamada mutiplierque retorne uma função anônima.
  • Segundo, chame a multiplierfunção e atribua o valor retornado à $doublevariá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 à $tripplevariá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 useconstruçã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.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *