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 compor deve aceitar múltiplos callable e retornar uma Closure.
  • A ordem de execução deve ser da direita para a esquerda (a última função é aplicada primeiro).
  • Use strtoupper(...), trim(...) e strrev(...) como argumentos.
  • A saída para a string " hello " deve ser OLLEH.

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

  1. A função compor recebe um número variável de callable usando ...$funcoes.
  2. Ela retorna uma closure que captura $funcoes com use.
  3. Dentro da closure, invertemos o array de funções com array_reverse para aplicar da direita para a esquerda.
  4. Para cada função, chamamos $fn($valor) e atualizamos $valor com o resultado.
  5. No código principal, criamos $processar passando strtoupper(...), trim(...) e strrev(...).
  6. A sintaxe funcao(...) cria objetos Closure a partir das funções nativas.
  7. 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ós strrev e trim, o que não é o esperado.
  • Usar strtoupper sem (...): 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 $funcoes com use: 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