1
resposta

Fatal error: Uncaught Error: Cannot access private property Conta::$saldo

@vinicius, joia ? Professor, seguinte se deixo os atributos como public passa se os deixo private não. Estou com o PHP 7.3.9 C:\Users\pabli>php -v PHP 7.3.9 (cli) (built: Aug 28 2019 09:28:48) ( ZTS MSVC15 (Visual C++ 2017) x64 ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.3.9, Copyright (c) 1998-2018 Zend Technologies

E o erro herado em tela é:

Fatal error: Uncaught Error: Cannot access private property Conta::$saldo in C:\laragon\www\conta\index.php:4 Stack trace: #0 {main} thrown in C:\laragon\www\conta\index.php on line 4

segue o meu código:

<?php

class Conta { private $cpfTitular; private $nomeTitular; private $saldo = 0;

public function saca(float $valorASacar): void
{
    if ($valorASacar > $this->saldo) {
        echo "Saldo indisponível";
        return;
    }

    $this->saldo -= $valorASacar;
}

public function deposita(float $valorADepositar): void
{
    if ($valorADepositar < 0) {
        echo "Valor precisa ser positivo";
        return;
    }

    $this->saldo += $valorADepositar;
}

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

    $this->saca($valorATransferir);
    $contaDestino->deposita($valorATransferir);
}

public function recuperaSaldo(): float
{
    return $this->saldo;
}

public function defineCpfTitular(string $cpf): void
{
    $this->cpfTitular = $cpf;
}

public function recuperaCpfTitular(): string
{
    return $this->cpfTitular;
}

public function defineNomeTitular(string $nome): void
{
    $this->nomeTitular = $nome;
}

public function recuperaNomeTitular(): string
{
    return $this->nomeTitular;
}

}

1 resposta

Você não pode acessar um método privado de uma outra classe a não ser que você extenda ela para a classe que você deseja acessar o método. Por isso você recebe o erro "Cannot access private property Conta::$saldo" ou seja, em tradução o interpretador está te dizendo "Pablo, eu não consigo acessar essa propriedade por que ela é privada, por favor coloque ela como pública, ou extenda a classe".

E esse é o motivo de não conseguir acessar um método privado. Você pode visualizar uma explicação mais detalhada na documentação do PHP :)

Caso você deseje utilizar, use o método público saldo, para acessar o método você utiliza:

$this->saldo();

E no seu caso está utilizando a propriedade dessa forma:

$this->saldo

Tem uma diferença na chamada, chamando o método/função você vai conseguir acessar pois seu método é publico, ele consegue acessar acessar a propriedade privada dentro da sua classe, pois apesar da propriedade ser privada o método que acessa ela é público.