4
respostas

Erro ao executar (php Bonificacoes.php), alguém pode me ajudar?

Erro apresentado no Prompt
>php Bonificacoes.php
PHP Fatal error:  Uncaught TypeError: Argument 2 passed to Alura\Banco\Modelo\Funcionario::__construct() must be of the type string, object given, called in C:\Users\stefan.reis\Documents\cursos\php\projeto\Bonificacoes.php on line 13 and defined in C:\Users\stefan.reis\Documents\cursos\php\projeto\src\Modelo\Funcionario.php:10
Stack trace:
#0 C:\Users\stefan.reis\Documents\cursos\php\projeto\Bonificacoes.php(13): Alura\Banco\Modelo\Funcionario->__construct('Vinicius Dias', Object(Alura\Banco\Modelo\CPF), 'Desenvolvedor', 1000)
#1 {main}
  thrown in C:\Users\stefan.reis\Documents\cursos\php\projeto\src\Modelo\Funcionario.php on line 10

Fatal error: Uncaught TypeError: Argument 2 passed to Alura\Banco\Modelo\Funcionario::__construct() must be of the type string, object given, called in C:\Users\stefan.reis\Documents\cursos\php\projeto\Bonificacoes.php on line 13 and defined in C:\Users\stefan.reis\Documents\cursos\php\projeto\src\Modelo\Funcionario.php:10
Stack trace:
#0 C:\Users\stefan.reis\Documents\cursos\php\projeto\Bonificacoes.php(13): Alura\Banco\Modelo\Funcionario->__construct('Vinicius Dias', Object(Alura\Banco\Modelo\CPF), 'Desenvolvedor', 1000)
#1 {main}
  thrown in C:\Users\stefan.reis\Documents\cursos\php\projeto\src\Modelo\Funcionario.php on line 10

=========================================================== Conteúdo do arquivo Bonificações.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('987.654.321-10'),
    'Gerente',
    3000
);

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

echo $controlador->recuperaTotal();

=========================================================== Conteúdo do arquivo ControladorDeBonificacoes.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;
    }

}

===========================================================

Conteúdo do arquivo Funcionário.php

namespace Alura\Banco\Modelo;

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

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

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

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

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

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

Ola, Stefan.

A mensagem de erro é bem clara. Olha seu construtor da classe Funcionario:

public function __construct(string $nome, string $cpf, string $cargo, float $salario)

Ele espera como segundo parâmetro uma string.

Olha como você instanciou:

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

Você tá passando um objeto (um CPF).

Faltou alterar o construtor de Funcionario para atender essa nova expectativa.

;-)

public function __construct(string $nome, **string $cpf**, string $cargo, float $salario)

public function __construct(string $nome, **CPF $cpf**, string $cargo, float $salario)

Isso aí. Essa é, inicialmente, a alteração necessária, Stefan. :-D

Funcionou?

Apresentou outro erro. Vou tentar sozinho, se eu não conseguir, vou postar o erro aqui.