Médio PHP
Conta bancária com promoção de construtor
Enunciado
Crie uma classe ContaBancaria usando promoção de construtor para as propriedades titular (string) e saldo (float, padrão 0). Adicione métodos depositar(float $valor) e sacar(float $valor) que atualizam o saldo e retornam o novo saldo. O método sacar não deve permitir saque maior que o saldo. Exiba o saldo após operações.
Requisitos
- Usar promoção de construtor para declarar e inicializar as propriedades.
- O método
depositardeve somar o valor ao saldo e retornar o novo saldo. - O método
sacardeve subtrair o valor somente se houver saldo suficiente, caso contrário retornar o saldo atual sem alteração. - O programa deve criar uma conta, realizar um depósito e um saque, e imprimir os saldos resultantes.
Código inicial
<?php
// Defina a classe ContaBancaria com promoção de construtor
// Crie uma conta e teste depósito e saque
Saída esperada
Saldo após depósito: 150.00
Saldo após saque: 100.00
Tentativa de saque acima do saldo. Saldo atual: 100.00
Ver dica
No método sacar, verifique se $valor <= $this->saldo antes de subtrair.
Mostrar solução
<?php
class ContaBancaria {
// Promoção de construtor
public function __construct(
private string $titular,
private float $saldo = 0.0
) {}
public function depositar(float $valor): float {
$this->saldo += $valor;
return $this->saldo;
}
public function sacar(float $valor): float {
if ($valor <= $this->saldo) {
$this->saldo -= $valor;
}
return $this->saldo;
}
public function getSaldo(): float {
return $this->saldo;
}
}
$conta = new ContaBancaria("Carlos", 0);
$conta->depositar(150.0);
echo "Saldo após depósito: " . number_format($conta->getSaldo(), 2, '.', '') . PHP_EOL;
$conta->sacar(50.0);
echo "Saldo após saque: " . number_format($conta->getSaldo(), 2, '.', '') . PHP_EOL;
$conta->sacar(200.0); // não deve alterar
echo "Tentativa de saque acima do saldo. Saldo atual: " . number_format($conta->getSaldo(), 2, '.', '') . PHP_EOL;
Passo a passo
- A classe
ContaBancariausa promoção de construtor: os parâmetros$titulare$saldojá criam as propriedades privadas. - O método
depositarsoma o valor ao saldo e retorna o novo saldo. - O método
sacarverifica se o valor é menor ou igual ao saldo; se sim, subtrai; caso contrário, mantém o saldo. - Criamos uma conta com saldo inicial 0.
- Depositamos 150 e imprimimos o saldo formatado.
- Sacamos 50 e imprimimos; depois tentamos sacar 200 (maior que o saldo) e imprimimos o saldo inalterado.
Por que funciona
A promoção de construtor elimina a necessidade de declarar propriedades separadamente e atribuí-las no corpo do construtor. Os métodos usam $this->saldo para acessar e modificar o saldo do objeto atual. A verificação no saque protege a integridade dos dados.
Erros comuns
- Esquecer o
$this->ao modificar o saldo:$saldo += $valor;criaria uma variável local e não alteraria a propriedade. - Não verificar o saldo no saque: permitiria saldo negativo.
- Usar
number_formatsem especificar separador decimal: a saída pode usar vírgula e quebrar o formato esperado.
Outra forma de resolver
Sem promoção de construtor:
class ContaBancaria {
private string $titular;
private float $saldo;
public function __construct(string $titular, float $saldo = 0) {
$this->titular = $titular;
$this->saldo = $saldo;
}
// ...
}
Útil em versões anteriores ao PHP 8.
Saída esperada
Saldo após depósito: 150.00
Saldo após saque: 100.00
Tentativa de saque acima do saldo. Saldo atual: 100.00