Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

[Dúvida] Erro ao criar __construct

Olá a todos. Estou enfrentando uma situação que não sei exatamente o motivo.

Ao criar a function do tipo _ _construct e atribuir o valor da propriedades privadas por ele, o VSCode está acusando um erro na propriedade $saldoTitular. Após tentar outras formas de escrever o código, descobri que se eu remover a tipagem 'float' lá na propriedade private da certo (no caso consigo atribuir o valor 0 dentro do $saldoTitular no construct), mas se tiver o float da erro.

Vou mandar abaixo a forma que deu errado e a forma que da certo, tentei pesquisar e entender o porque disso, mas ainda não consegui entender o motivo

Aimagem que mandei é a forma que da errado

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

FORMA QUE DEU CERTO:

<php?

class Conta

{

    private string $cpfTitular;
    
    private string $nomeTitular;
    
    private $saldoTitular;

    public function __construct(string $cpfTitular, string $nomeTitular)
    {
        $this->cpfTitular = $cpfTitular; //$cpfTitular
       
        $this->nomeTitular = $nomeTitular; //$nomeTitular

        $this->saldoTitular = 0; //$saldoTitular
    }

    public function sacar(float $valorASacar)
    {
        if ($valorASacar > $this->saldoTitular){
            echo "Saldo insuficiente.";
            return;
        }
           $this->saldoTitular -= $valorASacar;
    }

    public function depositar(float $valorADepositar)
    {
        if($valorADepositar <= 0){
            echo "Valor a depositar precisar ser positivo" . PHP_EOL;
            return;
        }
            $this->saldoTitular += $valorADepositar;
    }

    public function transferir(float $valorATransferir, Conta $contaDestino) : void
    {
        if($valorATransferir > $this->saldoTitular){
            echo "Saldo indisponível";
            return;
        }
            $this->sacar($valorATransferir);
            $contaDestino->depositar($valorATransferir);
    }
}

FORMA QUE DEU ERRADO:

<php?

class Conta

{

    private string $cpfTitular;
    
    private string $nomeTitular;
    
    private float $saldoTitular;    

    public function __construct(string $cpfTitular, string $nomeTitular)
    {
        $this->cpfTitular = $cpfTitular; //$cpfTitular
       
        $this->nomeTitular = $nomeTitular; //$nomeTitular

        $this->saldoTitular = 0; //$saldoTitular
    }

    public function sacar(float $valorASacar)
    {
        if ($valorASacar > $this->saldoTitular){
            echo "Saldo insuficiente.";
            return;
        }
           $this->saldoTitular -= $valorASacar;
    }

    public function depositar(float $valorADepositar)
    {
        if($valorADepositar <= 0){
            echo "Valor a depositar precisar ser positivo" . PHP_EOL;
            return;
        }
            $this->saldoTitular += $valorADepositar;
    }

    public function transferir(float $valorATransferir, Conta $contaDestino) : void
    {
        if($valorATransferir > $this->saldoTitular){
            echo "Saldo indisponível";
            return;
        }
            $this->sacar($valorATransferir);
            $contaDestino->depositar($valorATransferir);
    }
}

Segue o erro (ignorem o numero da linha, pois removi caractere pra caber aqui):

Fatal error: Uncaught Error: Typed property Conta::$saldoTitular must not be accessed before initialization in C:\Users\adria\Desktop\CursoPHP\CursoPHP\3 - Orientação a Objetos com PHP Classes, métodos e atributos\src\ContaPrivate.php:67
Stack trace:
#0 C:\Users\adria\Desktop\CursoPHP\CursoPHP\3 - Orientação a Objetos com PHP Classes, métodos e atributos\bancoPrivate.php(6): Conta->depositar(500.0)
#1 {main}
  thrown in C:\Users\adria\Desktop\CursoPHP\CursoPHP\3 - Orientação a Objetos com PHP Classes, métodos e atributos\src\ContaPrivate.php on line 67
PHP Fatal error:  Uncaught Error: Typed property Conta::$saldoTitular must not be accessed before initialization in C:\Users\adria\Desktop\CursoPHP\CursoPHP\3 - Orientação a Objetos com PHP Classes, métodos e atributos\src\ContaPrivate.php:67
Stack trace:
#0 C:\Users\adria\Desktop\CursoPHP\CursoPHP\3 - Orientação a Objetos com PHP Classes, métodos e atributos\bancoPrivate.php(6): Conta->depositar(500.0)
#1 {main}
  thrown in C:\Users\adria\Desktop\CursoPHP\CursoPHP\3 - Orientação a Objetos com PHP Classes, métodos e atributos\src\ContaPrivate.php on line 67
3 respostas
require_once 'src/ContaPrivate.php';

    $contaExemplo = new Conta(cpfTitular: '123.456.789-10', nomeTitular: 'Adriano dos Santos');
    $contaExemplo->depositar(500);
    $contaExemplo->sacar(100); //isso é ok
    // $contaExemplo->saldoTitular -= 100; //isso não é ok

    echo $contaExemplo->getSaldoTitular();
    echo $contaExemplo->getCpfTitular();
    echo $contaExemplo->getNomeTitular();
solução!

Oi, Raffinato, tudo bem?

O erro que você está recebendo, "Typed property Conta::$saldoTitular must not be accessed before initialization", significa que você está tentando acessar a propriedade $saldoTitular antes de inicializá-la.

O problema é que quando você define a propriedade $saldoTitular como float, o PHP espera que essa propriedade seja inicializada com um valor do tipo float antes de ser acessada. No entanto, no construtor da sua classe, você está atribuindo o valor 0 (interpretado como int pelo PHP) à propriedade $saldoTitular.

Para corrigir esse problema, você pode inicializar a propriedade $saldoTitular com um valor float no construtor da sua classe, ou realizar a alteração que você fez, removendo o float.

Espero ter ajudado. Caso tenha dúvidas, não hesite em postar no fórum!

Abraços!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Boa noite Rodrigo.

Muito obrigado pela ajuda!