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"; });

Here you find the average performance (time & memory) of each version. A grayed out version indicates it didn't complete successfully (based on exit-code).

VersionSystem time (s)User time (s)Memory (MiB)
8.5.90.0200.00616.85
8.5.80.0220.00716.59
8.5.70.0300.00916.90
8.5.60.0260.00416.71
8.5.50.0250.00716.64
8.5.40.0200.00616.29
8.5.30.0160.00616.79
8.5.20.0130.00616.72
8.5.10.0150.00916.51
8.5.00.0050.00716.63
8.4.240.0040.00719.71
8.4.230.0160.00519.33
8.4.220.0240.01019.49
8.4.210.0220.00819.32
8.4.200.0210.00919.59
8.4.190.0190.00519.59
8.4.180.0190.00819.38
8.4.170.0150.00719.52
8.4.160.0130.00819.60
8.4.150.0140.00519.65
8.4.140.0100.01017.70
8.4.130.0160.00617.71
8.4.120.0170.00617.85
8.4.110.0230.01017.54
8.4.100.0180.00717.80
8.4.90.0160.01117.88
8.4.80.0240.01117.77
8.4.70.0160.00617.73
8.4.60.0180.00617.81
8.4.50.0240.00317.59
8.4.40.0180.00617.57
8.4.30.0170.00517.59
8.4.20.0210.00317.50
8.4.10.0140.00617.73
8.3.330.0140.00618.35
8.3.320.0170.00318.21
8.3.310.0140.00518.52
8.3.300.0110.00718.46
8.3.290.0130.00418.46
8.3.280.0120.00718.49
8.3.270.0180.00216.86
8.3.260.0170.00416.81
8.3.250.0130.00616.80
8.3.240.0190.00516.92
8.3.230.0160.00316.77
8.3.220.0150.00516.55
8.3.210.0140.00516.68
8.3.200.0190.00316.75
8.3.190.0180.00416.70
8.3.180.0230.00516.64
8.3.170.0300.00716.65
8.3.160.0180.00216.77
8.3.150.0120.00616.55
8.3.140.0170.00316.62
8.3.130.0130.00416.56
8.3.120.0150.00416.55
8.3.110.0160.00216.54
8.3.100.0190.00416.69
8.3.90.0170.00516.67
8.3.80.0160.00516.88
8.3.70.0150.00516.46
8.3.60.0160.00516.53
8.3.50.0150.00716.45
8.3.40.0130.00717.73
8.3.30.0150.00217.88
8.3.20.0120.00517.95
8.3.10.0120.00617.91
8.3.00.0190.00517.98
8.2.330.0120.00618.06
8.2.320.0200.00417.80
8.2.310.0130.00517.98

preferences:
43.45 ms | 838 KiB | 5 Q