3v4l.org

run code in 500+ PHP versions simultaneously
<?php declare(strict_types=1); /** * ========================================================================== * SISTEMA BANCÁRIO FUNCIONAL EM PHP MODERN (COMPLETO) * ========================================================================== * * Conceitos aplicados do Mapa Mental: * 1. Pure Functions * 2. Higher-Order Functions (array_reduce) * 3. Immutability & Value Objects (Readonly DTOs) * 4. Function Composition * 5. Currying * 6. Lazy Evaluation with Generators (yield) * 7. Pattern Matching (match) */ /** * -------------------------------------------------------------------------- * 1. IMUTABILIDADE & VALUE OBJECTS (Readonly DTOs) * -------------------------------------------------------------------------- */ 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 ) {} } /** * DTO Tipado para o Estado do Processamento. * Substitui o array genérico por uma estrutura 100% type-safe. */ readonly class ResultadoProcessamento { /** * @param array<string, Conta> $contas * @param array<string> $chavesProcessadas */ public function __construct( public array $contas, public array $chavesProcessadas ) {} /** * Método auxiliar puramente funcional: * Retorna uma NOVA instância de ResultadoProcessamento com os novos dados. */ public function comTransacao(Conta $novaConta, string $novaChave): self { return new self( contas: array_merge($this->contas, [$novaConta->id => $novaConta]), chavesProcessadas: array_merge($this->chavesProcessadas, [$novaChave]) ); } public function possuiChave(string $chave): bool { return in_array($chave, $this->chavesProcessadas, true); } } /** * -------------------------------------------------------------------------- * 2. PURE FUNCTIONS (Funções Puras) * -------------------------------------------------------------------------- */ 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`) * -------------------------------------------------------------------------- */ 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 * -------------------------------------------------------------------------- */ 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. HIGHER-ORDER FUNCTIONS & IDEMPOTÊNCIA (`array_reduce`) * -------------------------------------------------------------------------- */ function processarComIdempotencia(array $contasIniciais, iterable $transacoes): ResultadoProcessamento { $listaTransacoes = is_array($transacoes) ? $transacoes : iterator_to_array($transacoes); $estadoInicial = new ResultadoProcessamento( contas: $contasIniciais, chavesProcessadas: [] ); return array_reduce( $listaTransacoes, function (ResultadoProcessamento $estado, Transacao $tx): ResultadoProcessamento { // Checagem de Idempotência if ($estado->possuiChave($tx->idempotencyKey)) { 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"; // Retorna um NOVO DTO imutável return $estado->comTransacao($novaConta, $tx->idempotencyKey); }, $estadoInicial ); } /** * -------------------------------------------------------------------------- * 6. LAZY EVALUATION WITH GENERATORS (`yield`) * -------------------------------------------------------------------------- */ 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), ]; // 1. Teste de Currying + Validation $validarMinimo10 = criarValidadorValorMinimo(10.0); try { echo "--- Teste de Validação (Currying) ---\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"; } // 2. Processamento funcional echo "--- Processando Stream com DTO Tipado (ResultadoProcessamento) ---\n"; $resultadoFinal = processarComIdempotencia($contas, gerarStreamTransacoes()); // 3. Exibição segura dos dados lendo a propriedade $contas do DTO imutável echo "\n--- SALDO FINAL DAS CONTAS ---\n"; foreach ($resultadoFinal->contas as $conta) { echo "Conta: {$conta->id} | Saldo Final: R$ {$conta->saldo}\n"; } echo "\n--- HISTÓRICO DE CHAVES IDEMPOTENTES REGISTRADAS ---\n"; echo implode(", ", $resultadoFinal->chavesProcessadas) . "\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.0220.01117.04
8.5.80.0240.00816.80
8.5.70.0180.00617.16
8.5.60.0170.00416.80
8.5.50.0130.00616.83
8.5.40.0160.00516.46
8.5.30.0150.00516.74
8.5.20.0230.00216.73
8.5.10.0130.00816.57
8.5.00.0050.00516.71
8.4.240.0050.00519.72
8.4.230.0170.00419.50
8.4.220.0140.00719.81
8.4.210.0150.00419.58
8.4.200.0160.00319.73
8.4.190.0150.00419.69
8.4.180.0140.00319.79
8.4.170.0140.00619.71
8.4.160.0140.00419.62
8.4.150.0120.00619.76
8.4.140.0140.00517.68
8.4.130.0170.00517.23
8.4.120.0160.00217.78
8.4.110.0210.00217.97
8.4.100.0160.00517.82
8.4.90.0140.00617.77
8.4.80.0160.00417.68
8.4.70.0180.00417.80
8.4.60.0140.00517.65
8.4.50.0150.00617.92
8.4.40.0150.00617.75
8.4.30.0180.00317.79
8.4.20.0160.00417.72
8.4.10.0190.00317.59
8.3.330.0150.00618.59
8.3.320.0200.00418.38
8.3.310.0180.00418.54
8.3.300.0160.00418.48
8.3.290.0160.01018.46
8.3.280.0230.00518.16
8.3.270.0130.00416.70
8.3.260.0140.00516.74
8.3.250.0140.00616.76
8.3.240.0130.00616.75
8.3.230.0190.00316.61
8.3.220.0240.00517.07
8.3.210.0140.00416.49
8.3.200.0160.00416.59
8.3.190.0150.00416.62
8.3.180.0130.00516.54
8.3.170.0130.00616.81
8.3.160.0150.00416.64
8.3.150.0180.00416.64
8.3.140.0160.00416.75
8.3.130.0110.00616.69
8.3.120.0130.00516.55
8.3.110.0180.00116.57
8.3.100.0140.00616.78
8.3.90.0180.00516.63
8.3.80.0160.00416.75
8.3.70.0130.00516.51
8.3.60.0150.00716.66
8.3.50.0170.00316.68
8.3.40.0150.00417.82
8.3.30.0130.00317.99
8.3.20.0110.00718.05
8.3.10.0170.00718.00
8.3.00.0120.00518.02
8.2.330.0140.00717.70
8.2.320.0160.00517.89
8.2.310.0190.00218.01

preferences:
48.78 ms | 838 KiB | 5 Q