Funções anônimas em PHP

| 3 minutes read

Introdução

Não é novidade para ninguém que foram incluídos no PHP 5.3 alguns recursos novos que a tornam uma linguagem melhor e mais completa.

A novidade é que eu irei publicar aqui a partir deste post, exemplos de como escrever código PHP usando estas funcionalidades.

Minha idéia é de escrever posts curtos e direto ao ponto.

As funções anônimas, também conhecidas como closures e lambda functions são funcionalidades que são definidas sem que elas possuam um nome que as identifica e normalmente são usadas para definirmos funções que não serão utilizadas em nenhum outro local, apenas naquele momento específico.

Como eu uso isso?

Normalmente quando escrevemos uma função, nós declaramos o nome dela e assim sabemos como identifica-la na hora em que precisamos usa-la.

Exemplo:

<?php
function funcaoExemplo($parametro1, $parametro2) {
    return "Faça alguma coisa com o $parametro1 e com o $parametro2";
}
echo funcaoExemplo('Hello','World');
?>

O exemplo acima demonstra a maneira convencional que declaramos e usamos as funções em PHP, abaixo eu mostrarei alguns exemplos de uso das funções anônimas.

O próximo exemplo é a declaração e uso de uma função semelhante à declarada no exemplo anterior, porém, na forma de função anônima:

<?php
$funcaoExemplo = function($parametro1, $parametro2) {
    return "Faça alguma coisa com o $parametro1 e com o $parametro2";
};

echo $funcaoExemplo('Hello','Função Anônima');
?>

Como você pôde observar, a função não recebe um nome quando é declarada e sim ela é atribuída a uma variável comum PHP.

Nós podemos utilizar nestas funções as variáveis declaradas fora de seu escopo, para isso nós devemos importar as variáveis por meio do comando use. Exemplo:

<?php
$nome = 'Adler';
$sobrenome = 'Brediks';
$mostraMeuNome = function() use ($nome, $sobrenome) {
    $sobrenome .= ' Medrado';
    echo "Seu nome é: $nome $sobrenome";
};
$mostraMeuNome();
?>

É possível usar variáveis passadas como referência. O exemplo anterior será modificado para ilustrar a funcionalidade:

<?php
$nome = 'Adler';
$sobrenome = 'Brediks';
$mostraMeuNome = function() use ($nome, &$sobrenome) {
    $sobrenome .= ' Medrado';
    echo "Seu nome é: $nome $sobrenome";
};
echo '<br>';
$mostraMeuNome();
echo '<br>';
echo $sobrenome;
?>

Faça o teste e veja que se o operador de referência(&) for removido, a variável $sobrenome não é modificada fora do escopo da função.

As closures podem ser muito bem aproveitadas em conjunto com funções nativas do PHP que necessitam de uma função de callback, como a função array_map que será a função usada em meu exemplo. Veja:

<?php
$arrExemploMap = array(1,2,3,4,5,6,7,8,9,10);
$ret = array_map(function($v) {
    return $v * $v;
}, $arrExemploMap);

var_dump($ret);
?>

O código acima exemplifica o que falei anteriormente a respeito de declarar funções que não serão usadas em mais nenhum lugar.

Usando isso em objetos

Esta funcionalidade também pode ser usada no paradigma POO e o conceito é exatamente o mesmo, basta preparar o seu método para receber uma função desta como parâmetro. Exemplo:

<?php
class Lambida {
    public function hello($param1, $callback) {
        echo 'Esse é o valor do $param1: ' . $param1 . '<br />';
        echo $callback();
    }
}

$lambida = new Lambida();
$lambida->hello('Eu amo muito tudo isso', function() {
    return 'Eu sou o retorno da funcao de callback'; }
);
?>

Conclusão

Este é mais um recurso que o PHP oferece para torna-lo mais ágil e eficiente.

Os exemplos que eu apresentei já servem como ponto de partida para estudos mais aprofundados e eu espero que ele tenha sido útil para você.

Se você já usou este recurso em situações diferentes das que eu apresentei, deixe seu comentário.

Abraços.

← Promoção do PHPSP te ajuda a tirar certificações Zend | Quase um ano de Dangolino sem precisar alterar uma linha de código →