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

Erro no Método Construtor

PHP Fatal error: Uncaught TypeError: Cannot assign Titular to property Conta::$titular of type string in C:\Users\Igor\Desktop\phpPOO\src\Conta.php:12

//MÉTODO CONSTRUTOR
    public function __construct(Titular $titular)
    {
        $this->titular = $titular;
        $this->saldo = 0;

        //Acessando o MÉTODO ESTÁTICO
        self::$numeroDeContas++;
    } 

Estou perdido com este erro...

5 respostas

Como você está declarando os atributos da classe Conta? E que argumentos você está passando ao instanciar uma nova conta?

<?php 

class Conta 
{
    private string $titular;
    private float $saldo;
    private static $numeroDeContas = 0;

    //MÉTODO CONSTRUTOR
    public function __construct(Titular $titular)
    {
        $this->titular = $titular;
        $this->saldo = 0;

        //Acessando o MÉTODO ESTÁTICO
        self::$numeroDeContas++;
    } 

    //MÉTODO DESTRUTOR
    public function __destruct()
    {
        self::$numeroDeContas--;

    }

    //Função dentro da classe é chamada de MÉTODO
    public function saca(float $valorASacar): void 
    {
        if ($valorASacar > $this->saldo){
            echo "Saldo indisponivel";
            return;
        } 

        $this->saldo -= $valorASacar;

    }

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

        $this->saldo += $valorADepositar ;

    }

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

        $this->sacar($valorATransferir);
        $contaDestino->depositar($valorATransferir);

    }

    //Método recuperarSaldo - MÉTODO GET
    public function recuperaSaldo( ):float
    {
        return $this->saldo;
    }

    // //Método recuperarNomeTitular
    public function recuperaNomeTitular():string 
    {
        return $this->titular->recuperaNome();
    }

    //Método recuperarCpfTitular - MÉTODO GET
    public function recuperaCpfTitular():string 
    {
        return $this->cpfTitular->recuperaCpfTitular();
    }

    public static function recuperaNumeroDeContas():int
    {
        return self::$numeroDeContas;
    } 
}

e para criar uma nova conta:

$novaConta = new Conta(new Titular('123.456.789-10', 'Igor Cavalera'));

O problema está justamente na declaração do atributo titular, você declarou como sendo do tipo String, porém deveria ser do tipo Titular:

<?php 

class Conta 
{
    private Titular $titular;//Tipo Titular
    private float $saldo;
    private static $numeroDeContas = 0;

Desta forma a chamada do construtor de Conta recebe um objeto do tipo Titular, fazendo assim uma composição.

solução!

Fala Igor, beleza?

Você está declarando a propriedade titular como uma string, porém no construtor você está informado que o parâmetro é do tipo Titular.

Eu não sei como está a sua modelagem, mas caso $titular seja realmente do tipo Titular modifique o tipo do parâmetro para Titular:

class Conta 
{
    private Titular $titular;
    private float $saldo;
    private static $numeroDeContas = 0;

    //MÉTODO CONSTRUTOR
    public function __construct(Titular $titular)
    {
        $this->titular = $titular;
        $this->saldo = 0;

        //Acessando o MÉTODO ESTÁTICO
        self::$numeroDeContas++;
    }