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

Erro ao realizar teste das bonificações

Olá, Estou com um erro no arquivo, após realizar as etapas da aula, ao fazer o teste para verificar se o sistema consegue atribuir as bonificações corretamente, recebi o seguinte erro:

PHP Fatal error:  Uncaught Error: Typed property Alura\Banco\Modelo\Funcionario::$salario must not be accessed before initialization in D:\Alura\projeto\src\Modelo\Funcionario.php:36
Stack trace:
#0 D:\Alura\projeto\src\Service\ControladorBonificacoes.php(13): Alura\Banco\Modelo\Funcionario->calcularBonificacao()
#1 D:\Alura\projeto\testeBonificacoes.php(13): Alura\Banco\Service\ControladorBonificacoes->adicionarBonificacao(Object(Alura\Banco\Modelo\Funcionario))
#2 {main}
  thrown in D:\Alura\projeto\src\Modelo\Funcionario.php on line 36

Fatal error: Uncaught Error: Typed property Alura\Banco\Modelo\Funcionario::$salario must not be accessed before initialization in D:\Alura\projeto\src\Modelo\Funcionario.php:36
Stack trace:
#0 D:\Alura\projeto\src\Service\ControladorBonificacoes.php(13): Alura\Banco\Modelo\Funcionario->calcularBonificacao()
#1 D:\Alura\projeto\testeBonificacoes.php(13): Alura\Banco\Service\ControladorBonificacoes->adicionarBonificacao(Object(Alura\Banco\Modelo\Funcionario))
#2 {main}
  thrown in D:\Alura\projeto\src\Modelo\Funcionario.php on line 36

Process finished with exit code 255

Tentei por umas duas horas tentar identificar qual poderia ser o problema, mas sem sucesso, gostaria da ajuda de vocês pra descobrir o que fiz de errado. Segue abaixo os códigos referentes às classes.

Funcionário:

<?php

namespace Alura\Banco\Modelo;


class Funcionario extends Pessoa
{
    private string $cargo;
    private float $salario;

    public function __construct(string $nome, Cpf $cpf, string $cargo, float $salario)
    {
        parent::__construct($nome, $cpf);
        $this->cargo = $cargo;
        $this->cargo = $salario;
    }

    public function retornarCargo() : string
    {
        return $this->cargo;
    }

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

    public function retornarSalario(): float
    {
        return $this->salario;
    }

    public function calcularBonificacao(): float
    {
        return $this->salario * 0.1;
    }
}

ControladorBonificacoes:

<?php

namespace Alura\Banco\Service;

use Alura\Banco\Modelo\Funcionario;

class ControladorBonificacoes
{
    private float $totalBonificacao = 0;

    public function adicionarBonificacao(Funcionario $funcionario)
    {
        $this->totalBonificacao += $funcionario->calcularBonificacao();
    }

    public function retornarTotalBonificacoes(): float
    {
        return $this->totalBonificacao;
    }
}

testeBonificacoes:

<?php

require_once 'autoload.php';

use Alura\Banco\Service\ControladorBonificacoes;
use Alura\Banco\Modelo\{Funcionario, Cpf};

$func01 = new Funcionario('João', new Cpf('123.456.789-10'),'Desenvolvedor', 3000);
$func02 = new Funcionario('José', new Cpf('123.456.789-11'), 'Gerente', 5000);


$controlador = new ControladorBonificacoes();
$controlador->adicionarBonificacao($func01);
$controlador->adicionarBonificacao($func02);

echo $controlador->retornarTotalBonificacoes();

Fico na aguardo pelo auxílio e já agradeço pela ajuda.

3 respostas
solução!

Olá João,

A mensagem de erro está informando que você está acessando o atributo $salario antes de inicializá-lo (dar um valor).

Acredito que a causa esteja no construtor de Funcionario, você acabou repetindo cargo e não salvando o valor de salario:

// Salvando salario em cargo
$this->cargo = $salario;

Assim não é possível acessar o atributo salario depois pois ele não tem nenhum valor. Corrigindo para o código abaixo deve resolver o problema:

$this->salario= $salario;

Espero ter ajudado, qualquer dúvida é só falar!

Olá, Lucas. Você estava correto, realmente eu dei bobeira nessa, o que gerou o erro que não conseguia identificar. Obrigado pela ajuda.

Sem problemas João! Esse é um erro bem comum, já conheço porque faço do mesmo jeito direto.