Ir para conteúdo

POWERED BY:

Arquivado

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

John Lennon

[Resolvido] implementação PDO + POO e Herança

Recommended Posts

Boa tarde, meu nome é john e sou novo no forum, bem como também em orientação a objetos.

 

possuo uma dúvida relativa a herança e PDO, criei uma classe PDOConnectionFactory com o seguinte código:

 

 

<?php

require_once 'MysqlConfig.class.php';


class PDOConnectionFactory {

   private $connection;
   private $dsn;       


   private function getPDOConnectionFactory() {
       $dados = new MysqlConfig();
       $this->dsn = $dados->getDrive().":host=".$dados->getHost().";";

       try {
          //$this->connection = new PDO("mysql:host=localhost; dbname=nenebelo, 'root', ''");
         $this->connection = new PDO($this->dsn." dbname=".$dados->getDb(), $dados->getUser(), $dados->getPswd());

                echo 'conectado com sucesso';

       } catch (PDOException $e) {

           echo "Erro ao Conectar com o banco de dados " . $dados->getDb() . "\n<br>" . $e->getMessage() .
           "\n<br> Erro Na linha #" . $e->getLine();   
       }


   return $this->connection;
   }

   public function closePDOConnection(){

       if( $this->connection != null)
         {
           $this->connection = null;
         }

  }
}



?>

 

onde a mesma realiza a conexão de forma correta se eu instanciar um objeto desta classe (dentro do proprio arquivo e fora do escopo da classe) porem estou herdando esta classe em uma DAOGENERIC com o seguinte código:

<?php
require_once 'PDOConnectionFactory.class.php';


class GenericDAO /*extends PDOConnectionFactory*/ {

private $nomecampo;
private $tabela;
private $connectar = null;
private $std;

   public function _inserir($nomecampo , $tabela){
       $this->connectar = new PDOConnectionFactory();

       try {

           //$this->connectar = parent::getPDOConnectionFactory();



           //$this->std = $this->connectar->prepare("select * from Revendedores");
       }
      catch (Exception $e){

         echo $e->getMessage()."<br>\n".$e->getCode()."<br>\n".$e->getLine()."<br>\n";
      }

}

}

?>

 

 

a dúvida é, como eu poderei acessar dentro da Classe DAO GENERIC o Objeto connection instanciado dentro do metodo getPDOConnection da Classe PDOConnectionFactory, o motivo pelo qual quero acessalo é para utilizar o proprio Objeto com os atributos do PDO para querys e etc. Ficarei muito grato com um possível ajuda. sem mais John.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mude o escopo de "private" para "protected"! Se "$connection" for declarado como private, apenas a classe "PDOConnectionFactory" poderá usá-lo, mas se declará-lo como "protected" as classes filhas, ou seja, as classes que herdam essa classe, poderão utilizá-lo também!

 

<?php

require_once 'MysqlConfig.class.php';


class PDOConnectionFactory {

   protected $connection; #Escopo deve ser protected
   private $dsn;       


   private function getPDOConnectionFactory() {
       $dados = new MysqlConfig();
       $this->dsn = $dados->getDrive().":host=".$dados->getHost().";";

       try {
          //$this->connection = new PDO("mysql:host=localhost; dbname=nenebelo, 'root', ''");
         $this->connection = new PDO($this->dsn." dbname=".$dados->getDb(), $dados->getUser(), $dados->getPswd());

                echo 'conectado com sucesso';

       } catch (PDOException $e) {

           echo "Erro ao Conectar com o banco de dados " . $dados->getDb() . "\n<br>" . $e->getMessage() .
           "\n<br> Erro Na linha #" . $e->getLine();   
       }


   return $this->connection;
   }

   public function closePDOConnection(){

       if( $this->connection != null)
         {
           $this->connection = null;
         }

  }
}



?>

 

 

Depois é so fazer assim:

 

<?php
require_once 'PDOConnectionFactory.class.php';


class GenericDAO extends PDOConnectionFactory {

private $nomecampo;
private $tabela;
private $connectar = null;
private $std;

   public function _inserir($nomecampo , $tabela){
       $this->connectar = $connection; #Se eu nao estou enganado, no lugar de $connection poderia ser PDOConnectionFactory::$connection ou ate mesmo parent::$connection

  }

}

?>

 

Nesse caso não é necessário usar o try/catch pois isso já é feito na classe pai!

 

Eu tenho algumas sugestões! Na classe pai, você pode fazer a conexão com o banco de dados usando o método mágico "__construct", pois assim que a classe for "chamada" o conexão irá ser realizada! Outra sugestão, é colocar o método que realizará a query na classe pai, ou seja, PDOConnectionFactory!

 

Eu ia colocar um exemplo, mas também estou começando agora! Aproveitando o seu tópico:

 

Se eu tenho uma classe pai e uma classe filha que têm um método com o mesmo nome, como eu vou diferenciá-los? Ou seja, chamar o método que eu quero sem ter erro? E com as variáveis? Como faço?

 

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

John Lennon

a dúvida é, como eu poderei acessar dentro da Classe DAO GENERIC o Objeto connection instanciado dentro do metodo getPDOConnection da Classe PDOConnectionFactory, o motivo pelo qual quero acessalo é para utilizar o proprio Objeto com os atributos do PDO para querys e etc. Ficarei muito grato com um possível ajuda. sem mais John.

 

Nesse caso não cabe herança, use composição.

 

class GenericDAO {

private $nomecampo;
private $tabela;
private $connectar = null;
private $std;
 public function __construct(PDOConnectionFactory $conn){
   $this->connectar = $conn;
 }     public function _inserir($nomecampo , $tabela){


  }

}

_____________________________________________________________________________

 

Se eu tenho uma classe pai e uma classe filha que têm um método com o mesmo nome, como eu vou diferenciá-los? Ou seja, chamar o método que eu quero sem ter erro? E com as variáveis? Como faço?

Se você sobrescreve um método da classe mãe/pai, instanciando um objeto da classe filha você vai executar o método sobrescrito.

Somente dentro da classe filha é possível referenciar a classe pai, através de parent::method();.

 

Exemplo:

class A {
public function foo() {
   	echo "Foo\n";
}
}

class B extends A {
public function foo() {
   	parent::foo();
   	echo "Bar\n";
}
}

$b = new B();
$b->foo(); 
// mostra: 
// Foo
// Bar

 

Com propriedades, não dá pra fazer:

<?php
class Foo {
protected $foo = "bar\n";
public function __construct() {
	echo $this->foo;
}
}

class Bar extends Foo {
protected $foo = "bazzinga\n";
public function __construct() {
	echo parent::$foo;
	echo $this->foo;
}
}

$foo = new Foo();
$bar = new Bar();

 

O exemplo acima não funciona...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Outra dúvida referente ao mesmo assunto, para funcionar herança no php existe alguma configuração que é necessário do php.ini? pois segui os passos aqui ditos para acessar os metodos da classe pai e o netbeans não reconheceu o metodo da classe pai. Mais um dúvida como é utilizado o autoload e existe alguma cfg especifica para que ele funcione em ambiente local e/ou web?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nâo, não existe configuração nenhuma, o problema é o Netbeans.

Não fique dependente das ferramentas, algum dia eles param de fornecê-la e aí? Como você vai fazer?

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.