3v4l.org

run code in 500+ PHP versions simultaneously
<?php declare(strict_types=1); /** * ========================================================================== * SISTEMA BANCÁRIO FUNCIONAL COM IDEMPOTÊNCIA EM PHP MODERN * ========================================================================== * * Conceitos aplicados do Mapa Mental: * 1. Pure Functions * 2. Higher-Order Functions (array_reduce, array_walk) * 3. Immutability (Readonly DTOs) * 4. Function Composition * 5. Currying * 6. Lazy Evaluation with Generators (yield) * 7. Pattern Matching (match) */ /** * -------------------------------------------------------------------------- * 1. IMUTABILIDADE (Readonly DTOs) * -------------------------------------------------------------------------- * As estruturas de dados são imutáveis. Alterações geram novas instâncias. */ readonly class Conta { public function __construct( public string $id, public float $saldo ) {} } readonly class Transacao { public function __construct( public string $idempotencyKey, public string $tipo, // 'DEPOSITO' ou 'SAQUE' public float $valor, public string $contaId ) {} } /** * -------------------------------------------------------------------------- * 2. PURE FUNCTIONS (Funções Puras) * -------------------------------------------------------------------------- * Sem efeitos colaterais. Entrada idêntica = Nova saída idêntica. */ function depositar(Conta $conta, float $valor): Conta { return new Conta($conta->id, $conta->saldo + $valor); } function sacar(Conta $conta, float $valor): Conta { if ($valor > $conta->saldo) { throw new InvalidArgumentException("Saldo insuficiente na conta {$conta->id}!"); } return new Conta($conta->id, $conta->saldo - $valor); } /** * -------------------------------------------------------------------------- * 3. PATTERN MATCHING (PHP 8 `match`) * -------------------------------------------------------------------------- * Avaliação declarativa de tipos de operação. */ function aplicarTransacao(Conta $conta, Transacao $tx): Conta { return match ($tx->tipo) { 'DEPOSITO' => depositar($conta, $tx->valor), 'SAQUE' => sacar($conta, $tx->valor), default => throw new InvalidArgumentException("Tipo de transação desconhecido: {$tx->tipo}") }; } /** * -------------------------------------------------------------------------- * 4. CURRYING * -------------------------------------------------------------------------- * Decompõe funções de múltiplos argumentos para pré-configuração. */ function criarValidadorValorMinimo(float $valorMinimo): callable { return fn(float $valor) => fn(callable $operacao) => $valor < $valorMinimo ? throw new InvalidArgumentException("Valor mínimo deve ser R$ {$valorMinimo}") : $operacao(); } /** * -------------------------------------------------------------------------- * 5. FUNCTION COMPOSITION (Composição de Funções) * -------------------------------------------------------------------------- * Pipeline de execução encadeando funções puras. */ function compor(callable ...$funcoes): callable { return fn($input) => array_reduce( $funcoes, fn($acc, $fn) => $fn($acc), $input ); } /** * -------------------------------------------------------------------------- * 6. HIGHER-ORDER FUNCTIONS & IDEMPOTÊNCIA (`array_reduce`) * -------------------------------------------------------------------------- * Substitui o loop foreach imperativo por uma redução funcional que * acumula imutavelmente o estado de contas e chaves processadas. */ function processarComIdempotencia(array $contasIniciais, iterable $transacoes): array { $listaTransacoes = is_array($transacoes) ? $transacoes : iterator_to_array($transacoes); $estadoInicial = [ 'contas' => $contasIniciais, 'chaves' => [] ]; $estadoFinal = array_reduce( $listaTransacoes, function (array $estado, Transacao $tx): array { // Garantia de Idempotência if (in_array($tx->idempotencyKey, $estado['chaves'], true)) { echo "⚠️ [IDEMPOTÊNCIA] Transação {$tx->idempotencyKey} ignorada (já processada).\n"; return $estado; } $contaAtual = $estado['contas'][$tx->contaId] ?? new Conta($tx->contaId, 0.0); $novaConta = aplicarTransacao($contaAtual, $tx); echo "✅ Transação {$tx->tipo} de R$ {$tx->valor} na conta {$tx->contaId} concluída. Saldo atual: R$ {$novaConta->saldo}\n"; return [ 'contas' => array_merge($estado['contas'], [$tx->contaId => $novaConta]), 'chaves' => array_merge($estado['chaves'], [$tx->idempotencyKey]) ]; }, $estadoInicial ); return $estadoFinal['contas']; } /** * -------------------------------------------------------------------------- * 7. LAZY EVALUATION WITH GENERATORS (`yield`) * -------------------------------------------------------------------------- * Stream de transações consumido sob demanda com baixa pegada de memória. */ function gerarStreamTransacoes(): Generator { yield new Transacao('tx_key_001', 'DEPOSITO', 500.0, 'conta_A'); yield new Transacao('tx_key_002', 'SAQUE', 150.0, 'conta_A'); yield new Transacao('tx_key_001', 'DEPOSITO', 500.0, 'conta_A'); // Duplicada (Ignorada) yield new Transacao('tx_key_003', 'DEPOSITO', 1000.0, 'conta_B'); yield new Transacao('tx_key_002', 'SAQUE', 150.0, 'conta_A'); // Duplicada (Ignorada) } // ========================================================================== // EXECUÇÃO DO SCRIPT // ========================================================================== echo "=== INICIANDO SISTEMA BANCÁRIO FUNCIONAL ===\n\n"; // Estado inicial $contas = [ 'conta_A' => new Conta('conta_A', 0.0), 'conta_B' => new Conta('conta_B', 100.0), ]; // Teste de Currying + Composition $validarMinimo10 = criarValidadorValorMinimo(10.0); try { echo "--- Teste de Validação (Currying + Composition) ---\n"; $depositoValidado = $validarMinimo10(50.0)( fn() => depositar($contas['conta_A'], 50.0) ); echo "Depósito de R$ 50 validado! Novo saldo simulado da conta_A: R$ {$depositoValidado->saldo}\n\n"; } catch (Exception $e) { echo "Erro: " . $e->getMessage() . "\n\n"; } // Processamento funcional com Idempotência echo "--- Processando Stream com array_reduce (Idempotência & Generators) ---\n"; $contasFinais = processarComIdempotencia($contas, gerarStreamTransacoes()); // Exibição funcional declarativa usando a função nativa array_walk echo "\n--- SALDO FINAL DAS CONTAS ---\n"; array_walk($contasFinais, function (Conta $conta) { echo "Conta: {$conta->id} | Saldo Final: R$ {$conta->saldo}\n"; });
Output for git.master_jit, git.master
=== INICIANDO SISTEMA BANCÁRIO FUNCIONAL === --- Teste de Validação (Currying + Composition) --- Depósito de R$ 50 validado! Novo saldo simulado da conta_A: R$ 50 --- Processando Stream com array_reduce (Idempotência & Generators) --- ✅ Transação DEPOSITO de R$ 500 na conta conta_A concluída. Saldo atual: R$ 500 ✅ Transação SAQUE de R$ 150 na conta conta_A concluída. Saldo atual: R$ 350 ⚠️ [IDEMPOTÊNCIA] Transação tx_key_001 ignorada (já processada). ✅ Transação DEPOSITO de R$ 1000 na conta conta_B concluída. Saldo atual: R$ 1100 ⚠️ [IDEMPOTÊNCIA] Transação tx_key_002 ignorada (já processada). --- SALDO FINAL DAS CONTAS --- Conta: conta_A | Saldo Final: R$ 350 Conta: conta_B | Saldo Final: R$ 1100

This tab shows result from various feature-branches currently under review by the php developers. Contact me to have additional branches featured.

Active branches

Archived branches

Once feature-branches are merged or declined, they are no longer available. Their functionality (when merged) can be viewed from the main output page


preferences:
50.44 ms | 840 KiB | 4 Q