Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Método Construtor (Testes)

Boa noite,

Estou com um problema em um método construtor que estou testando. Esta é a Classe Tarefa:

<?php
require_once ("Categoria.php");
class Tarefa{

    public $id;
    public $nome;
    public $inicio; 
    public $fim;
    public $categoria; 
    public $user_id;


    function __construct($nome, Categoria $categoria, $user_id){
        $this->$nome;
        $this->$categoria->id;
        $this->$user_id;
    }

    function getInicio(){
        return $this->inicio;
    }
    function setInicio($inicio){
        if($inicio == null OR $inicio == ""){
            $inicio =  date('Y-m-d');
        }else{
            $this->inicio = $inicio;
        }
    }
}

Esta é a Classe Categoria:

<?php
    class Categoria
    {
        private $id;
        private $nome;

        public function getId()
        {
            return $this->id;
        }

        public function setId($id)
        {
            $this->id = $id;
        }

        public function getNome()
        {
            return $this->nome;
        }

        public function setNome($nome)
        {
            $this->nome = $nome;
        }
    }

Esta é a Logica para inserir uma tarefa:

<?php 
require_once("class/Tarefa.php");
require_once("class/Usuario.php");
require_once("cabecalho.php");
require_once("banco-tarefa.php");
require_once("logica-usuario.php");

verificaUsuario();

$categoria = new Categoria;
$categoria->setId($_POST['categoria_id']);

$tarefa = new Tarefa($_POST['nome'], $categoria->getId(), $user['id']);
$tarefa->id = null;
$tarefa->$_POST['inicio'];
$tarefa->$_POST['fim'];

if(insereTarefa($conexao, $tarefa)){ 
    $_SESSION["success"] = "A tarefa $tarefa->nome, foi incluida com sucesso.";
    header("Location: lista-tarefas.php");    
}else{ 
    $msg=mysqli_error($conexao);//Recebe mensagem de erro do banco
    $_SESSION["success"] = "A tarefa $tarefa->$nome?></strong> não foi incluida com sucesso $msg."; 
    header("Location: lista-tarefas.php");
}
mysqli_close($conexao);
require_once ("rodape.php");

O tentar realizar qualquer ação com a Classe Tarefa (listar por exemplo), o PHP me apresenta a seguinte mensagem.

Catchable fatal error: Object of class Categoria could not be converted to string in C:\xampp\htdocs\glaw_2.0\class\Tarefa.php on line 14

Já tentei acessar via método o objeto categoria, mas recebo este erro.

Catchable fatal error: Argument 2 passed to Tarefa::__construct() must be an instance of Categoria, string given, called in C:\xampp\htdocs\glaw_2.0\adiciona-tarefa.php on line 13 and defined in C:\xampp\htdocs\glaw_2.0\class\Tarefa.php on line 12

Se eu remover o método construtor tudo flui perfeitamente, no entanto gostaria de mante-lo por motivo de segurança.

Alguém teria alguma solução o u forma de contornar isso?

Grato. Gustavo

2 respostas
solução

Qual versão do PHP você esta usando? Você esta tipando um parâmetro no construtor, isso só é possível no PHP 7.

Mude de:

function __construct($nome, Categoria $categoria, $user_id){

para:

function __construct($nome, $categoria, $user_id){

Outro problema é que você esta passando para o construtor o ID da categoria, não o objeto:

$tarefa = new Tarefa($_POST['nome'], $categoria->getId(), $user['id']);

Veja que você esta passando $categoria->getId(). Tem que ser um objeto categoria, e não seu ID.

Olá Flávio,

Estou utilizando a versão 5.6.19.

Esta versão pelo que li no PHP.net já suporta esse tipo de parâmetro.<br>

Descobri que o erro está na passagem do parâmetro para a criação da classe. Esta é a forma que estava fazendo.:

$tarefa = new Tarefa($_POST['nome'], $categoria->getId(), $user['id']);

Agora estou fazendo dessa forma (funcional):

$categoria = new Categoria;
$categoria->setId($_POST['categoria_id']);
$tarefa = new Tarefa($_POST['nome'], $categoria, $user['id']);
$tarefa->id = null;
$tarefa->setInicio($_POST['inicio']);
$tarefa->setFim($_POST['fim']);

No caso remover o objeto Categoria do parâmetro não é uma opção pois eu pretendo usar para futuras validações.

Sua forma é funcional apenas não me atende.

Agradeço sua solução.

Att. Gustavo