Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Andrew Solera

[Resolvido] classes

Recommended Posts

Amigos, boa noite!

 

Vejam se podem me ajudar com o problema abaixo.

 

Estou tentando trabalhar com uma classe de usuários similar ao código abaixo:

 

<?php
class User
{
 public $id;

 function __construct()
 {
    $this->id = 1; // Apenas um exemplo, supondo que o 1 viesse de algum outro método

    $this->verificaIdExistente(); // Verifica se aquele ID existe no banco
 }

 function verificaIdExistente()
 {
    global $database;

    $request = $database->verificaIdExistente(); // Chama o método da classe DAO, que irá retornar TRUE ou FALSE

    if($request == TRUE)
    {
    // Faz algo
    }
    else
    {
    // Faz algo
    }
 }
}
$user = new User;

 

E tenho uma outra classe de banco de dados, também semelhante ao código abaixo:

<?php
class DAO
{

 function __construct()
 {
    // Conexão do banco, etc...
 }

 function verificaIdExistente()
 {
    global $user;

    $sql = "SELECT id FROM tb_user WHERE id = " . $user->id . " LIMIT 1";
    $rs = mysql_query($sql);
    // (etc...)
 }
}
$database = new DAO;

 

Se eu implementar desta forma, o método $database->verificaIdExistente() não consegue acessar o id que existe na classe User ($user->id). É retornado o erro "Notice: Trying to get property of non-object in...".

 

Caso eu passe o parâmetro entre os métodos, funciona normalmente.

Exemplo:

Na classe User:

...
$request = $database->verificaIdExistente($this->id);
...

e na classe DAO:

...
function verificaIdExistente($id)
 {
    $sql = "SELECT id FROM tb_user WHERE id = $id LIMIT 1";
    $rs = mysql_query($sql);
    // (etc...)
 }
...

 

Basicamente, o que estou tentando fazer no primeiro cenário é acessar uma propriedade da classe User dentro de um método da classe DAO, sem precisar ficar passando parâmetros pra lá e pra cá.

Na realidade eu queria entender o motivo dessa primeira forma de implementação não funcionar.

 

Grato!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se eu implementar desta forma, o método $database->verificaIdExistente() não consegue acessar o id que existe na classe User ($user->id). É retornado o erro "Notice: Trying to get property of non-object in...".

 

Claro, você não instanciou o objeto User, então é impossível acessá-lo, neste caso faça assim:

 

<?php

require_once('User.php');

class DAO{

 private $user;

 function __construct(){
    $this->user = new User();
 }

 function verificaIdExistente(){
    $sql = "SELECT id FROM tb_user WHERE id = " . $this->user->id . " LIMIT 1";
    $rs = mysql_query($sql);
 }
}

$database = new DAO();

O que eu fiz foi basicamente: Incluir a classe, porquê se não você não consegue instanciar seu objeto. Depois criei um atirbuto privado $user, e instanciei a classe User usando este método com o $this. Mas porquê? Por que, em outros métodos, caso eu precise acessar métodos da classe User, o objeto desta classe já existe, então é só fazer:

$this->user->metodo1();
$this->user->metodo2();

Porém, eu ainda posso fazer ainda melhor, algo como:

<?php

require_once('User.php');

class DAO{

 function __construct(){

 }

 function verificaIdExistente(User $user){
    $sql = "SELECT id FROM tb_user WHERE id = " . $user->id . " LIMIT 1";
    $rs = mysql_query($sql);
 }
}

require_once ('User.php');
$database = new DAO();
$database->verificaIdExistente(new User());

Fazendo assim, eu to dizendo que o objeto TEM que vir de User, e não de outro tipo. É meio complicado eu tentar lhe explicar essa outra maneira, vou deixar para os mais experiêntes lhe ajudar, e eu não sei se este vai funcionar, tentei rodar aqui na mina cabeça logo as 8:15 da manhã! =)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Guilherme, muito obrigado!!

 

Graças às suas explicações consegui entender o que estava de errado e implementei um pouco diferente do que você mostrou.

 

Na realidade, um dos problemas da minha aplicação é que eu estava chamando o método verificaIdExistente no __construct() da classe User.

Nas primeiras tentativas tentando utilizar o seu exemplo, a aplicação acabava entrando em um loop infinito, pois toda vez que eu chamava a classe User o sistema disparava o método verificaIdExistente.

 

Após corrigir, ficou desta forma:

 

Arquivo user.php:

require_once('database.php');

class User {
 private $database;
 public $id;

 function __construct(){
   $this->database = new DAO;
   $this->id = 1;
 }

 function verificaIdExistente(){
   $request = $this->database->verificaIdExistente(new User);
   //(...restante do programa...)
 }
}
$user = new User;

A vantagem que encontrei aqui é que agora não preciso ficar declarando "global $database" em todas os métodos de $user. Fantástico!

 

O arquivo database.php ficou exatamente igual ao seu último exemplo, exceto pelas 3 últimas linhas.

 

A chamada de todas estas funções ficou no meu index.php, fazendo $user->verificaIdExistente(); .

 

Mais uma vez, muito obrigado! =)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.