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

Erro ao definir tipo Funcionario

Olá,

Por alguma razão, estou recebendo um erro quando defino o tipo Funcionario na função "adicionaBonificacaoDe" (como feito na aula), mas quando deixo sem o tipo, o teste roda. Poderiam me esclarecer o porque disso? Desde já, muito obrigado.

Erro:

PHP Fatal error: Uncaught TypeError: Argument 1 passed to Alura\Banco\Service\ControladorDeBonificacoes::adicionaBonificacaoDe() must be an instance of Alura\Banco\Service\ControladorDeBonificacoes, instance of Alura\Banco\Modelo\Funcionario given, called in x\bonificacoes.php on line 23 and defined in x\src\Service\ControladorDeBonificacoes.php:9

Funcionario.php

<?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->salario = $salario;
    }

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

    protected function alteraNome(string $nome): void
    {
        $this->validaNomeTitular($nome);
        $this->nome = $nome;
    }

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

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

ControladorDeBonificacoes.php

<?php

namespace Alura\Banco\Service;

class ControladorDeBonificacoes
{
    private $totalBonificacoes = 0;

    public function adicionaBonificacaoDe($funcionario)
    {
        $this->totalBonificacoes += $funcionario->calculaBonificacao();
    }

    public function recuperaTotal(): float
    {
        return $this->totalBonificacoes;
    }
}

bonificacoes.php

<?php

require_once 'autoload.php';

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

$umFuncionario = new Funcionario(
    'Vinicius Dias',
    new Cpf('123.456.789-10'),
    'Desenvolvedor',
    1000
);

$umaFuncionaria = new Funcionario(
    'Patricia',
    new Cpf('124.453.329-10'),
    'Gerente',
    3000
);

$controlador = new ControladorDeBonificacoes();
$controlador->adicionaBonificacaoDe($umFuncionario);
$controlador->adicionaBonificacaoDe($umaFuncionaria);

echo $controlador->recuperaTotal();
5 respostas

Gabriel, pelo código que você postou aqui não consegui ver o motivo para o erro não. Você consegue disponibilizar o código completo no GitHub pra eu dar uma olhada no projeto como um todo?

Vinicius, não sei se não fui claro na explicação, mas o código que postei é o código que estava rodando, sem problemas. O código que está dando erro é esse aqui:

ControladorDeBonificacoes.php

<?php

namespace Alura\Banco\Service;

class ControladorDeBonificacoes
{
    private $totalBonificacoes = 0;

    public function adicionaBonificacaoDe(Funcionario $funcionario)
    {
        $this->totalBonificacoes += $funcionario->calculaBonificacao();
    }

    public function recuperaTotal(): float
    {
        return $this->totalBonificacoes;
    }
}

A diferença é que nesse eu mantenho o tipo "Funcionario" na função "adicionaBonificacaoDe".

Se isso já tinha ficado claro, só avisar que subo no GitHub sim.

Gabriel, aparentemente você se esqueceu de importar a classe Funcionario com o use no início do arquivo. Vê se isso resolve.

Mas é claro... Muito obrigado, Vinicius! Acabei perdendo isso durante a aula porque no VSCode não consegui configurar uma maneira que importe automaticamente como no PhpStorm.

Só me resta uma dúvida: O código rodou sem problemas atualmente, mesmo quando não defini o tipo. Isso poderia vir a ser um problema no futuro? De que maneira?

solução!

Gabriel, sem definir um tipo no parâmetro seu método fica mais frágil.

Quem for usar sua classe vai poder passar qualquer parâmetro para o método o erro exibido vai ser menos descritivo.

Quando estiver mais seguro com a Orientação a Objetos, pesquise sobre Programação defensiva. É um conteúdo bastante interessante.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software