Ir para conteúdo

POWERED BY:

Arquivado

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

andrea cerqueira

Extender classe de DB

Recommended Posts

Como faço pra abrir uma conexão no meu model que extende minha classe db?

Eu sei que é uam coisa muito idiota, mas o método tá eternamente indefinido e já tentei de mil formas.

Meu código é mais ou menos isso:

 

            //------------ Db.php
            <?php
            class Db extends PDO {

                protected static $instance;

                protected function __construct() {}

                public static function getInstance() {

                    if(empty(self::$instance)) {
                        $db_info = array(
                            "db_host" => "localhost",
                            "db_port" => "3306",
                            "db_user" => "root",
                            "db_pass" => "",
                            "db_name" => "banco"
                        );
                        self::$instance = new Database("mysql:host=".$db_info['db_host'].';port='.$db_info['db_port'].';dbname='.$db_info['db_name'], $db_info['db_user'], $db_info['db_pass']);
                    }

                    return self::$instance;

                }

            }
            ?>


            //------------ Model.php
            <?php

            require_once('Db.php');

            class FuncionarioModel extends Db {

                private $database;

                public function list() {
                    $this->$database = Db::getInstance();

                    $query = "SELECT * FROM func";
                    $statement = $this->database->prepare($query);
                    $user = $statement->fetchObject();
                }

            }
            ?>

O erro é esse:

Fatal error: Call to undefined method DB::getinstance() in ... Model.php

Na linha:

this->$database = Db::getInstance();

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

testei esse codigo aqui no php5.4 o primeiro erro q deu foi :

Fatal error: Access level to Db::__construct() must be public (as in class PDO)

 

sobre esse erro:

 

http://stackoverflow.com/questions/4712169/cannot-define-constructor-as-protected-or-private-why
http://stackoverflow.com/questions/9656382/error-in-implementing-singleton-pattern
https://bugs.php.net/bug.php?id=61970

 

 

essa classe Database faz o q?

 

self::$instance = new Database("mysql:host="

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que você está fazendo não faz nenhum sentido.

 

1º - Herança define o tipo "é um". Um funcionário não é um banco de dados.

2º - Você herda erroneamente o Db e depois tenta recuperá-lo, hã?

3º - Singleton não deve ser usado para persistência.

4º - A classe Db estende PDO, mas instancia uma outra classe que não tem nada a ver.

5º - list() é uma construção de linguagem, portanto é nome reservado.

6º - O método list faz a query mas não retorna NADA.

 

Pelo que eu entendi, você deseja abrir uma conexão com PDO e usá-la para buscar funcionários. Na verdade, você não precisa de ter uma classe de banco de dados, não precisa de herdar nada e não precisa de singleton.

 

Isso basta:

 

<?php

class FuncionarioModel {
    private $database;

    public function __construct(PDO $pdo) {
        $this->database = $pdo;
    }

    public function listar() {
        $query = "SELECT * FROM func";
        $statement = $this->database->prepare($query);
        $user = $statement->fetchObject();
        return $user;
    }
}

 

 

E para usar a classe:

 

// Cria instância da PDO
$pdo = new PDO('mysql:host=localhost;port=3306;dbname=banco', 'root', '');

// Cria instância do model de funcionários passando a conexão PDO criada
$funcionarioModel = new FuncionarioModel($pdo);

// Código de teste para mostrar o retorno
var_dump($funcionarioModel->listar());

Compartilhar este post


Link para o post
Compartilhar em outros sites

Corrigido

			
            <?php
            class Db extends PDO {
                protected static $instance;
				
                protected static $host = 'localhost';
                protected static $port = '3306'     ;
                protected static $user = 'root'     ;
                protected static $pass = ''     ;
                protected static $db   = ''      ;
				
                public function __construct() {
					self::$instance = new PDO('mysql:host=' . self::$host . ';port=' . self::$port .';dbname=' . self::$db , self::$user , self::$pass );		
				}
				
                public static function getInstance(){
                    return self::$instance;
                }
            }
			?>
			
			<?php
            require_once('Db.php');

            class FuncionarioModel extends Db {
				
                public function __construct(){
					 parent::__construct();
					 $this->instance = parent::getInstance();
				}

                public function lista() {
                    $query = "SELECT * FROM tabela";
                    $stmt  = $this->instance->prepare($query);
                    $stmt->execute();
					$rs = $stmt->fetchAll();
					return $rs;
                }

            }
			?>
			<?php
			$func = new FuncionarioModel();
			$k = $func->lista();
			
			print_r($k);
           ?>

 

 

 

 

Mas como o @Enrico falou tem muita incoerência neste código, eu corrigi só a implementação

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não...

 

Você instanciou a PDO, basta usá-la. Isso é algo fantástico e simples chamado Dependency Injection.

 

Uma forma de organizar essas dependências é através de um DIC, um bem simples é o Pimple.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aqui funcionou legal o código que te passei,

 

 

parent::__construct();

Fatal error: Can not call constructor in FuncionarioModel.php



Eu só quero fazer uma classe de conexão, provavelmente estática pra chamar nos models.

 

Aqui funcionou legal o código que te passei, até mudei o seu método lista() para retornar uma lista de objetos stdClass:

 


public function lista() { $query = "SELECT * FROM func"; $stmt = $this->instance->prepare($query); $stmt->execute(); while($row = $stmt->fetchObject()){ $rs[] = $row ; } return $rs; }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estranho Raphael, aqui diz que não pode chamar o constutor que está dentro do construtor.

Fatal error: Cannot call constructor in...

 

public function __construct() {
        parent::__construct();
        $this->instance = parent::getInstance();
    }

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Estranho Raphael, aqui diz que não pode chamar o constutor que está dentro do construtor.

Fatal error: Cannot call constructor in...

 

public function __construct() {
        parent::__construct();
        $this->instance = parent::getInstance();
    }

 

 

O que acontece é que o construtor de FuncionarioModel roda o construtor de Db para obter a instância do PDO, e atribui esta instância à variavél $this->instance.

 

Não tem erro!

 

Imprime o erro todo pls!

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema dessa "classe estática" é que você gera acoplamento, cria uma overhead desnecessário e torna o código impossível de testar (digo testes unitários). De longe, isso é uma má prática.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema dessa "classe estática" é que você gera acoplamento, cria uma overhead desnecessário e torna o código impossível de testar (digo testes unitários). De longe, isso é uma má prática.

 

Em momento algum eu discordo de você, só que ela quer ('precisa') assim, e o fórum está pra resolver problemas.

 

A minha classe mesmo de conexão é extremamente diferente do que está posto aqui.

Só que por questões de sigilo trabalhista, não posso liberar os códigos que desenvolvo na empresa.

 

Por isso estou tentando ajudá-la com o que ela tem.

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.