Ir para conteúdo

POWERED BY:

Arquivado

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

Will Fernando

[Resolvido] acessa metodo do objeto retornado

Recommended Posts

opa galerinha ... mehh q tempo q nao criava topico por aki ja tava com saudad :P .. assim eu e meu amigo tamo tomando pau a semana tda com essa classe ... *na verdade é uma classe so pra nos estuda ulgums padroes ... nao vai ser utilizada eu acho .. mass.. em resumo eu nao consigo entende pq ele nao ta dexando acessa o metodo do objeto instanciado ... meu amigo extendeu a classe do PDO e ta bufando ... mas achei isso meio um jeito de "disfarça" que nao tava funcionando do jeito que nos qria.. entao resolvi ve se a galerinha pod da umas dicas ae ^^

 

valwww =]

 

<?php
//Objeto
class Conexao
  {
//Atributos
protected static $instancia;
//Metodos
     private function __construct()
       {
          try
            {
              $conn = New PDO('mysql:host=localhost;dbname=test','root','');
              $conn->setAttribute(PDO::ATTR_ERRMODE,TRUE);
              return $conn;
            }
          catch(PDOException $e)
            {
              echo $e->getMessage();
            }
       }
     public static function Conectar()
       {
          if (!self::$instancia)
            {
               self::$instancia = new self ;
            }
            return self::$instancia;
       }
  }
?>
<?php
// Testes
$blabla = Conexao::Conectar();
$list = $blabla->prepare('SELECT * FROM noticias');
$list->execute();
var_dump($list->fetchAll(PDO::FETCH_COLUMN));
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Voce esta condicionando o retorno da funçao a nao existencia da propriedade $instancia.

if (!self::$instancia) ... return

Veja como seria o correto:

public static function Conectar()
{
  if (!self::$instancia)
  {
    self::$instancia = new self ;
  }
  return self::$instancia;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

aehh .. eu botei ae agora a poco so pra testa .. esquici de tira .. mas igual nao ta bufando ... =/

 

Fatal error: Call to undefined method Conexao::prepare()

valwww =]

Compartilhar este post


Link para o post
Compartilhar em outros sites

opa galerinha ... mehh q tempo q nao criava topico por aki ja tava com saudad :P .. assim eu e meu amigo tamo tomando pau a semana tda com essa classe ... *na verdade é uma classe so pra nos estuda ulgums padroes ... nao vai ser utilizada eu acho .. mass.. em resumo eu nao consigo entende pq ele nao ta dexando acessa o metodo do objeto instanciado ... meu amigo extendeu a classe do PDO e ta bufando ... mas achei isso meio um jeito de "disfarça" que nao tava funcionando do jeito que nos qria.. entao resolvi ve se a galerinha pod da umas dicas ae ^^

 

Hummm, que confusão, heheheh

 

Bom, vamos lá:

 

 private function __construct()
 {
     try
     {
         $conn = New PDO('mysql:host=localhost;dbname=test','root','');
         $conn->setAttribute(PDO::ATTR_ERRMODE,TRUE);
         return $conn;
     }
     catch(PDOException $e)
     {
         echo $e->getMessage();
     }
 }

O construtor serve para construir e não para retornar alguma coisa, isso ai só vai funcionar se o método __construct deixar de ser o construtor e passar a ser um método normal, para você usar ele como um método normal é só deixar de usar o operador new:

 

 public static function Conectar()
 {
     if (!self::$instancia)
     {
     self::$instancia = self::__construct(); //Alerta para um procedimento totalmente POG
     }
 
     return self::$instancia;
 }

Isso ai vai resolver seu problema, mas sinceramente, se você disser o que você realmente quer fazer ai agente te ajuda a encontrar um caminho melhor.

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso ai vai resolver seu problema, mas sinceramente, se você disser o que você realmente quer fazer ai agente te ajuda a encontrar um caminho melhor.

hmm nao intendi como resolve :P tipo .. se eu nao der o retorno no construct como eu vo acessa o objeto ? tem como pega a variavel $conn de fora da classe ? e se tiver mesmo assim nao ia fica isquisito ? mass.. quanto ao q qria faze eh q andando por ae dei uma olhada nesses links ... * e outros sobre o assunto é claro ^^

 

http://pt.wikipedia.org/wiki/Singleton#Em_PHP

 

http://br2.php.net/pdo

 

e dai to tentando faze uma classe com o conteudo deles =] *pra estuda como funcionan na pratica..

 

mas relaxa man =D pode da dicas e opinioes a vontade to aqui pra aprende sempre ^^

 

valww

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso ai vai resolver seu problema, mas sinceramente, se você disser o que você realmente quer fazer ai agente te ajuda a encontrar um caminho melhor.

hmm nao intendi como resolve :P tipo .. se eu nao der o retorno no construct como eu vo acessa o objeto ? tem como pega a variavel $conn de fora da classe ? e se tiver mesmo assim nao ia fica isquisito ? mass.. quanto ao q qria faze eh q andando por ae dei uma olhada nesses links ... * e outros sobre o assunto é claro ^^

 

mas relaxa man =D pode da dicas e opinioes a vontade to aqui pra aprende sempre ^^

 

Bom amigão, de uma olhada nesse link: http://forum.imaster...conexao-mysqli/

Falei exatamente sobre singleton, se depois de ver esse link ainda restar alguma dúvida sobre esse ou qualquer outro pattern é só dar um toque que tentamos explicar...

 

PS: No link foi usado mysqli, porém você pode usar PDO ou qualquer outra classe que você queira permitir um único objeto

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

hmmm beleza ... agora acho que intendi ... O.o na verdade pensando agora ... nem eu sei pq diabos fui coloca esse construct ^^ .. vo tenta faze denovo .. dpois do o retorno pra galera se bufa legal

 

valwww

Compartilhar este post


Link para o post
Compartilhar em outros sites

é .. agora ta retornando legal .. so que cada vez q executo uma query ta trancando geral e no fim da pau no apache *localhost =/

 

<?php
class Conexao
  {
protected static $instancia;
     public static function Conectar()
       {
          if (empty(self::$instancia))
            {
               try
                  {
                     self::$instancia = New PDO('mysql:host=localhost;dbname=test','root','');
                     self::$instancia->setAttribute(PDO::ATTR_ERRMODE,TRUE);
                  }
               catch(PDOException $e)
                  {
                     echo $e->getMessage();
                  }
            }
            return self::$instancia;
       }
  }
?>
<?php
// Testes
$blabla = Conexao::Conectar();
//$list = $blabla->query('SELECT * FROM noticias');
//$list = $blabla->prepare('SELECT * FROM noticias');
//$list->execute();
//var_dump($list->fetchAll(PDO::FETCH_COLUMN));
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que você está fazendo é uma baita de uma gambiarra.

Se quer segurar a conexão em um escopo global,use a pattern Registry.

Repito: o que você está fazendo é muito feio!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

O Singleton é pra controle de instanciação,não uma maneira de segurar objetos em um escopo global,para isso existe a Registry.

Vamos dizer que só exista um universo.Sendo assim,como pode existir mais de 1 objeto universo na sua aplicação?Ai entra a Singleton...OH!Descobriram mais 1 universo?Modifica um poco sua classe universo pra só permitir 2 objetos.

A forma vai variar (o próprio exemplo que dei deixa isso meio claro).Mas olha uma implementação (PHP >= 5.3.*) que fiz e as vezes uso "pra casos mais genéricos de uso da pattern":

<?php
abstract class Singleton
{
   private static $instances;

   protected function __construct(){}

   private function __clone(){}

   final public static function &getInstance()
   {
       $class = get_called_class();
       if(!isset(self::$instances[$class])) {
           self::$instances[$class] = new $class;
       }
       return self::$instances[$class];
   }
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

hmm .. ok agora intendi .. tinha intendido o conceito errado sobre ele... tava pensando exatamente nisso em mante o objeto de conexao pra se aproveitado por tda aplicacao .. porque provavelmente ele seria o mesmo a cada instancia.. isso evitaria redundancia ..

 

vo da uma olhada nesse Registry .. =]

 

valww galera

Compartilhar este post


Link para o post
Compartilhar em outros sites

Existem maneiras melhores de evitar essa redundancia...

E seguinte...pensa a classe responsavel pela conexão sendo Singleton,como você faria se tivesse que conectar a vários bancos de dados?

Pra esse tipo de coisa acho legal usar Managers e Adapaters ou Factorys e Adapters (preferindo o primeiro).

Dá uma olhada nessa parte na Limber do Wilker.Ficou interessante,eu discordando de certas coisas que ele fez...

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.