6
respostas

Erro ao tipar o retorno da função

Bom dia Pessoal , estou fazendo o curso de php 7 , mas estou com um problema que é o seguinte, estou tipando o tipo de retorno de uma função para retornar um objeto 'usuario', mas não está dando certo pois ele interpreta o : como unexpected, será que pode ser algo na configuração ou no código mesmo ? ERRO :

 Parse error: syntax error, unexpected ':', expecting ';' or '{' in C:\wamp\www\miniblog-capitulo3\Vendor\DAO\UsuarioDAO.php on line 48

Código :

<?php

namespace Vendor\DAO;
use Vendor\Model\Usuario;

class UsuarioDAO{
    private $con;

    public function __construct($con){
        $this->con = $con;
    }


    public function adiciona(Usuario $usuario){        
        $query = "INSERT INTO Usuario (nome,senha,email,bio,dataDeIngresso) VALUES 
        (:nome,:senha,:email,:bio,:dataDeIngresso)";

        $stm = $this->con->prepare($query);
        $stm->bindValue(":nome",$usuario->getNome());
        $stm->bindValue(":senha",md5($usuario->getSenha()));
        $stm->bindValue(":email",$usuario->getEmail());
        $stm->bindValue(":bio",$usuario->getBio());
        $stm->bindValue(":dataDeIngresso",date("Y-m-d"));

        return $stm->execute();
    }

    public function alteraNome(Usuario $usuario){
        $query = "UPDATE Usuario SET Nome=:nome WHERE id=:id";

        $stm = $this->con->prepare($query);
        $stm->bindValue(":nome",$usuario->getNome());
        $stm->bindValue(":id",$usuario->getId());

        return $stm->execute();
    }

    public function alteraBio(Usuario $usuario){
        $query = "UPDATE Usuario SET Bio=:bio WHERE id=:id";

        $stm = $this->con->prepare($query);
        $stm->bindValue(":bio",$usuario->getBio());
        $stm->bindValue(":id",$usuario->getId());

        return $stm->execute();
    }

    public function buscaPorId(int $id) : Usuario{
        $query = "SELECT * FROM Usuario WHERE id = :id";

        $stm = $this->con->prepare($query);

        $stm->bindValue(":id",$id);

        $stm->execute();
        $usuario = $stm->fetchObject('Vendor\Model\Usuario');

        return $usuario;
    }

    public function buscaPorNome(String $nome) : Usuario{
        $query = "SELECT * FROM Usuario WHERE nome = :nome";

        $stm = $this->con->prepare($query);
        $stm->bindValue(":nome",$nome);

        $stm->execute();
        $usuario = $stm->fetchObject('Vendor\Model\Usuario');

        return $usuario;
    }

    public function buscaPorEmail(String $email) : Usuario{
        $query = "SELECT * FROM Usuario WHERE email = :email";

        $stm = $this->con->prepare($query);
        $stm->bindValue(":email",$email);

        $stm->execute();
        $usuario = $stm->fetchObject('Vendor\Model\Usuario');

        return $usuario;
    }

    public function login(String $email,String $senha) : Usuario{
        $query = "SELECT * FROM Usuario WHERE Email = :email AND Senha = :senha";

        $stm = $this->con->prepare($query);
        $stm->bindValue(":email",$email);
        $stm->bindValue(":senha",md5($senha));

        $stm->execute();
        $usuario = $stm->fetchObject('Vendor\Model\Usuario');
        return $usuario;
    }

}
6 respostas

Acredito que o seu php não é o 7. executei o seu codigo na minha maquina que usa a versão 5.4 e o mesmo erro foi retornado.

Executei o mesmo codigo em http://sandbox.onlinephpfunctions.com/

utilizando a versão 7 do php e tudo funcionou perfeitamente.

Essa funcionalidade de "tipar" o retorno só é presente na versão 7 do PHP

Olá Alfredo vou verificar , mas creio que o meu php é o 7 sim pois quando dou o comando php -v no prompt ele retorna como php 7 , mas mesmo assim vou checar.

Fala Lucas, tudo bom?

Pelo o que eu pude perceber (me corrija se eu estiver errado) você está utilizando o wamp server (ou algum outro gerenciador) para subir seu servidor local, certo?

Se sim, as vezes o wamp pode estar com uma versão diferente da versão que você instalou no seu terminal.

Para resolver isso, suba seu servidor pelo terminal com o comando:

php -S localhost:3000;
// e acesse no seu navegador
localhost:3000

Ou procure uma versão do wamp que trabalhe com a versão 7 do php. Sei que o Xampp possui versão compativel com php 7 disponivel pra download neste link:

https://www.apachefriends.org/pt_br/download.html

Qualquer dificuldade, compartilhe com a gente =)

Olá André eu desinstalei o wamp e instalei a versão mais recente com o php 7 , esse erro que relatei acabou sendo corrigido , mas ao subir meu server (agora no xampp) o erro agora é esse na classe UsuarioDAO , e não mudei uma linha de código.

 Fatal error: Uncaught TypeError: Return value of Vendor\DAO\UsuarioDAO::buscaPorNome() must be an instance of Vendor\Model\Usuario, boolean returned in /opt/lampp/htdocs/miniblog/Vendor/DAO/UsuarioDAO.php:70 Stack trace: #0 /opt/lampp/htdocs/miniblog/Vendor/Lib/UsuarioValidator.php(18): Vendor\DAO\UsuarioDAO->buscaPorNome('Lucas') #1 /opt/lampp/htdocs/miniblog/Vendor/Controller/LoginController.php(63): Vendor\Lib\UsuarioValidator->validaUsuario(Object(Vendor\Model\Usuario)) #2 /opt/lampp/htdocs/miniblog/index.php(24): Vendor\Controller\LoginController->register() #3 {main} thrown in /opt/lampp/htdocs/miniblog/Vendor/DAO/UsuarioDAO.php on line 70

Olá Lucas.

Uma possível explicação é que está dando algum erro relacionado ao PDO e o mesmo está em modo silencioso.

Repare que o retorno do fetchObject pode ser do tipo boolean em caso de erro:

Retorna uma instância da classe requerida com nome das propriedades que correspondem aos nomes das colunas ou FALSE em caso de falha

Não sei como está o código que constrói o PDO pois o mesmo está sendo injetado na sua DAO, então talvez seja isso, não sei, tenta dar uma olhada:

$db = new \PDO(
    '...',
    'user',
    'password',
    [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ]
);

Porque:

PDO oferece 3 opções diferentes de tratamento de erro:

PDO::ERRMODE_SILENT

This is the default mode...

Veja aqui na documentação do PHP: http://php.net/manual/en/pdo.error-handling.php

Aí então o que poderia estar acontecendo é que está dando algum erro e o PDO está suprimindo o mesmo e somente retornando FALSE. Para garantir, mude o construtor do PDO e use try/catch pra pegar as exceções que são lançadas (todas as exceções do PDO são do tipo PDOException).

Oi Lucas, referente a sua segunda duvida. Você poderia abrir um outro topico aqui no forum pra ela? As vezes alguém pode ter uma duvida semelhante e não encontrar =)

Garanto que sua duvida será respondida bem rapido!