Sistema Bancário
Parte da seção Programação Orientada a Objetos do Journey de PHP da Coddy. Lição 89 de 91.
Desafio
FácilVamos criar um Sistema Bancário que gerencia contas, transações e transferências entre contas. Você criará um sistema com encapsulamento adequado para proteger dados financeiros, herança para diferentes tipos de conta e validação para garantir a integridade dos dados.
Você organizará seu código em seis arquivos:
Transaction.php: Crie uma classeTransactionpara registrar operações financeiras. Use a promoção de propriedades no construtor paratype(string: "deposit", "withdrawal" ou "transfer"),amount(float) etimestamp(string). Todas as propriedades devem ser públicas e somente para leitura. Adicione um métodogetDescription(): stringque retorne"[type]: $[amount]"(formate o valor para 2 casas decimais).BankAccount.php: Inclua o arquivo Transaction. Crie uma classe abstrataBankAccountcom:- Promoção de propriedades no construtor para
accountNumber(string, pública e somente para leitura) eholderName(string, pública e somente para leitura) - Uma propriedade
$balanceprotegida, inicializada como 0.0 - Um array privado para armazenar o histórico de transações
getBalance(): float: retorna o saldo atualdeposit(float $amount): string: adiciona ao saldo, registra a transação e retorna"Deposited: $[amount]"abstract withdraw(float $amount): string: as classes filhas implementam as regras de saqueaddTransaction(Transaction $t): void: método protegido para adicionar transações ao históricogetTransactionCount(): int: retorna o número de transações
- Promoção de propriedades no construtor para
SavingsAccount.php: Inclua o arquivo BankAccount. Crie uma classeSavingsAccountque estendaBankAccountcom:- Uma constante de classe
INTEREST_RATEdefinida como 0.02 (2%) withdraw(float $amount): string: se o valor exceder o saldo, retorne"Insufficient funds"; caso contrário, desconte o valor, registre a transação e retorne"Withdrew: $[amount]"applyInterest(): string: calcula os juros sobre o saldo atual, adiciona-os como um depósito e retorna"Interest applied: $[interest]"
- Uma constante de classe
CheckingAccount.php: Inclua o arquivo BankAccount. Crie uma classeCheckingAccountque estendaBankAccountcom:- Uma propriedade
$overdraftLimitprivada, definida por meio do construtor (adicione um terceiro parâmetro com valor padrão 100.0) withdraw(float $amount): string: permite o saque se o valor não exceder o saldo + o limite de cheque especial; retorne"Insufficient funds (overdraft limit: $[limit])"em caso de falha ou"Withdrew: $[amount]"em caso de sucessogetOverdraftLimit(): float: retorna o limite de cheque especial
- Uma propriedade
Bank.php: Inclua ambos os arquivos de conta. Crie uma classeBankque gerencie as contas:- Um array privado para armazenar as contas indexadas pelo número da conta
addAccount(BankAccount $account): void: adiciona uma contafindAccount(string $accountNumber): ?BankAccount: retorna a conta ou nulltransfer(string $fromAccount, string $toAccount, float $amount): string: transfere dinheiro entre contas. Retorne"Source account not found","Destination account not found"ou o resultado do saque se ele falhar. Em caso de sucesso, deposite na conta de destino e retorne"Transferred $[amount] from [from] to [to]"
main.php: Inclua o arquivo Bank. Você receberá duas entradas: dados das contas (JSON) e operações (JSON).Formato do JSON das contas:
[{"type": "savings", "number": "SAV001", "holder": "Alice", "initial": 1000}, {"type": "checking", "number": "CHK001", "holder": "Bob", "initial": 500, "overdraft": 200}]Formato do JSON das operações:
[{"op": "deposit", "account": "SAV001", "amount": 200}, {"op": "withdraw", "account": "CHK001", "amount": 600}, {"op": "transfer", "from": "SAV001", "to": "CHK001", "amount": 300}, {"op": "interest", "account": "SAV001"}, {"op": "balance", "account": "SAV001"}]Crie o banco e todas as contas (depositando os valores iniciais). Processe cada operação:
"deposit": Imprima o resultado dedeposit()"withdraw": Imprima o resultado dewithdraw()"transfer": Imprima o resultado detransfer()"interest": Imprima o resultado deapplyInterest()(somente para contas poupança)"balance": Imprima"[holder] balance: $[balance]"(2 casas decimais)
Imprima cada resultado em uma nova linha. Formate todos os valores monetários com 2 casas decimais.
Lembre-se de que as transferências devem ser atômicas: se o saque falhar, o depósito não deve acontecer. A propriedade protegida $balance permite que as classes filhas a modifiquem, mantendo-a oculta do código externo e demonstrando o encapsulamento adequado em um contexto financeiro.
Experimente você mesmo
<?php
require_once 'Bank.php';
// Ler entrada
$accountsJson = trim(fgets(STDIN));
$operationsJson = trim(fgets(STDIN));
// Analisar entradas JSON
$accounts = (array)json_decode($accountsJson, true);
$operations = (array)json_decode($operationsJson, true);
// TODO: Criar uma instância de Bank
// TODO: Criar contas a partir dos dados de accounts
// Para cada conta em $accounts:
// - Se o tipo for "savings", criar SavingsAccount
// - Se o tipo for "checking", criar CheckingAccount (com overdraft se fornecido)
// - Adicionar conta ao bank
// - Depositar o valor inicial
// TODO: Processar cada operação
// Para cada operação em $operations:
// - "deposit": Imprimir o resultado de deposit()
// - "withdraw": Imprima o resultado de withdraw()
// - "transfer": Imprima o resultado de transfer()
// - "interest": Imprima o resultado de applyInterest() (apenas para savings)
// - "balance": Imprima "[holder] balance: $[balance]" (2 casas decimais)
?>Todas as lições de Programação Orientada a Objetos
1Fundamentos de OOP
Arquivos externosIntrodução à OOPClasses vs. objetosA palavra-chave $thisMétodosPropriedadesConstrutor (__construct)Destrutor (__destruct)Recapitulação - Calculadora simples4Herança
Herança BásicaA Palavra-chave parent::Sobrescrita de MétodosA Palavra-chave finalClasses AbstratasRecapitulação - Hierarquia de Funcionários7Encapsulamento
Público, Protegido, PrivadoModificadores de Acesso em ProfundidadeGetters e SettersOcultação de InformaçõesPromoção de Construtor (8.0)Recapitulação - Sistema de Registros de Alunos10Conceitos Avançados de OOP
Composição vs. HerançaInjeção de DependênciaClasses AnônimasEnums (PHP 8.1)Fibras (PHP 8.1)Análise Profunda da Clonagem de ObjetosGeradores e Iteradores13Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Repository2Namespaces e Autoloading
Introdução a NamespacesA palavra-chave usePadrão de Autoloading PSR-4Autoloader do ComposerRecapitulação - Projeto organizado5Interfaces e Contratos
Introdução às InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesInterface vs Classe AbstrataTipagem com InterfacesRecapitulação - Calculadora de Formas8Métodos Mágicos
Introdução aos Métodos Mágicos__toString e __debugInfo__get, __set, __isset, __unset__call e __callStatic__clone e Clonagem de Objetos__serialize e __unserializeRecapitulação - Coleção Personalizada11Sistema de Tipos e Tratamento de Erros
Declarações de TiposTipos NulosTipos de União e InterseçãoClasses de ExceçãoHierarquia de Exceções PersonalizadaTry, Catch, FinallyRecapitulação - Validador de Formulário14Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses de Livros e Usuários3Propriedades de Classes
Propriedades de Instância vs. EstáticasConstantes em ClassesMétodos e Propriedades EstáticosPropriedades Privadas e ProtegidasPropriedades Somente para Leitura (PHP 8.1)Recapitulação - Gerenciador de Contas Bancárias6Polimorfismo
Revisão da Sobrescrita de MétodosPolimorfismo via InterfacesIndicação de Tipos e Tipos UnionVinculação Estática TardiaRecapitulação - Processador de Pagamentos9Traits
Introdução a TraitsUsando Múltiplos TraitsResolução de Conflitos entre TraitsMétodos Abstratos em TraitsTraits vs. Herança12Padrões de Projeto – Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão Strategy15Desafios Finais
Plataforma de E-LearningSistema BancárioDesenvolvimento de Personagens de JogosServiço de Aluguel de VeículosPratique por conta própria: Compilador de PHP online