Desafio PHP
Composição de funções com first-class callable
Enunciado
Crie uma função compor que recebe um número variável de callables e retorna uma closure que aplica todas as funções da direita para a esquerda. Use a sintaxe de first-class callable (funcao(...)) para passar funções nativas como strtoupper, trim e strrev. Teste com uma string.
Requisitos
- A função
compordeve aceitar múltiploscallablee retornar umaClosure. - A ordem de execução deve ser da direita para a esquerda (a última função é aplicada primeiro).
- Use
strtoupper(...),trim(...)estrrev(...)como argumentos. - A saída para a string
" hello "deve serOLLEH.
Código inicial
<?php
function compor(callable ...$funcoes): Closure {
// Implemente
}
// Crie a composição usando first-class callable syntax
// $processar = compor(...);
// echo $processar(" hello ") . "\n";
Saída esperada
OLLEH
Ver dica
Use array_reduce com o array de funções invertido, ou um loop que aplica cada função ao resultado anterior.
Mostrar solução
<?php
function compor(callable ...$funcoes): Closure {
return function($valor) use ($funcoes) {
// Aplica da direita para a esquerda
foreach (array_reverse($funcoes) as $fn) {
$valor = $fn($valor);
}
return $valor;
};
}
// First-class callable syntax para funções nativas
$processar = compor(
strtoupper(...),
trim(...),
strrev(...)
);
echo $processar(" hello ") . "\n";
Passo a passo
- A função
comporrecebe um número variável decallableusando...$funcoes. - Ela retorna uma closure que captura
$funcoescomuse. - Dentro da closure, invertemos o array de funções com
array_reversepara aplicar da direita para a esquerda. - Para cada função, chamamos
$fn($valor)e atualizamos$valorcom o resultado. - No código principal, criamos
$processarpassandostrtoupper(...),trim(...)estrrev(...). - A sintaxe
funcao(...)cria objetosClosurea partir das funções nativas. - Chamamos
$processar(" hello ")e imprimimos o resultado.
Por que funciona
A composição de funções é um padrão funcional que encadeia transformações. A ordem da direita para a esquerda garante que a última função passada seja aplicada primeiro. A first-class callable syntax permite tratar funções nativas como valores, sem precisar de strings ou arrays, deixando o código mais limpo e seguro.
Erros comuns
- Esquecer
array_reverse: a ordem seria da esquerda para a direita, resultando em" HELLO "apósstrrevetrim, o que não é o esperado. - Usar
strtouppersem(...): isso passa uma string'strtoupper', que também é callable, mas não é a sintaxe first-class; funciona, mas não cumpre o requisito. - Não capturar
$funcoescomuse: a closure não teria acesso ao array, causando erro.
Outra forma de resolver
Usar array_reduce para compor:
return fn($valor) => array_reduce(
array_reverse($funcoes),
fn($carry, $fn) => $fn($carry),
$valor
);
Essa versão é mais declarativa e evita o loop explícito.
Saída esperada
OLLEH