O PHP suporta funções de primeira classe, o que significa que uma função pode ser atribuída a uma variável. Ambas definidas pelo usuário e as funções embutidas podem ser referenciadas como uma variável e invocadas dinamicamente. As Funções podem ser passadas como argumentos para outras funções (um recurso chamado de funções de ordem-superior) e uma função pode retornar outras funções.
Recursão, um recurso que permite uma função chamar ela mesma, é suportado pela linguagem, mas a maior parte do código PHP é focado em iteração.
Funções Anônimas (com suporte para closures) estão presentes desde a versão 5.3 do PHP (2009).
No PHP 5.4 foi adicionada a capacidade de atribuir closures no escopo de um objetos e também melhorou o suporte para funções chamáveis de tal forma podem ser usadas como sinônimo de funções anônimas em quase todos os casos.
O uso mais comum de funções de ordem superior ocorre na implementação do padrão Estratégia (Strategy). A função embutida
array_filter
pede a entrada de array (data) e uma função (uma estratégia ou um callback) usada como um filtro para
cada item do array.
Uma closure é uma função anônima que pode acessar variáveis importadas a partir de fora do escopo usando qualquer variável global. Teoricamente, um closure é uma função com alguns argumentos fechados (por exemplo, fixo) pelo ambiente quando é definido. Closures podem contornar restrições de escopo de variáveis de uma maneira simples.
No próximo exemplo, usamos closures para definir uma função que retorna um filtro único para array_filter
, fora
da família de funções de filtro.
Cada função de filtro na família aceita apenas elementos maiores que algum valor mínimo. Único filtro retornado pela
criteria_greater_than
é um closure com o argumento $min
pelo valor no escopo (dado como um argumento quando
criteria_greater_than
é chamada).
A vinculação antecipada é usada por padrão para a importação da variável $min
dentro da função criada. Para
verdadeiras closures com uma vinculação posterior deve ser usada uma referência quando importar. Imagine um template ou
uma biblioteca de validação, onde o closure é definido para capturar variáveis no escopo e acessá-los mais tarde quando
a função anônima for compilada.