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 depositar deve somar o valor ao saldo e retornar o novo saldo.
  • O método sacar deve 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

  1. A classe ContaBancaria usa promoção de construtor: os parâmetros $titular e $saldo já criam as propriedades privadas.
  2. O método depositar soma o valor ao saldo e retorna o novo saldo.
  3. O método sacar verifica se o valor é menor ou igual ao saldo; se sim, subtrai; caso contrário, mantém o saldo.
  4. Criamos uma conta com saldo inicial 0.
  5. Depositamos 150 e imprimimos o saldo formatado.
  6. 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_format sem 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