Chamada de metodo estatico com spl_autoload_register

23/03/2015

0

PHP

Olá pessoal.

Tenho tido um problema ao chamar um método estático de uma classe singleton de conexao.
Segue estrutura:

|-Classes
|-- Clientes.class.php
|-- Conexao.class.php
Index.php
autoload.php

Index.php
<?php
include "autoload.php";
 
use classes\Clientes;
 
$cliente = new Clientes();
$getClientes = $cliente->getClientes();
 
echo '<pre>';
print_r($getClientes);

autoload.php
spl_autoload_register(function ($class) {
    require_once(str_replace('\\', '/', $class . '.class.php'));
});

Clientes.class.php
<?php
namespace classes;
 
class Clientes {
 
	public $conn;
 
	public function __construct(){
 
		$this->conn = Conexao::getInstance();
	}
 
	
	public function getClientes(){
		
		$query = $this->conn->query("SELECT * FROM " . Conexao::getTabela('TB_CLIENTES'));
		
		foreach($query->fetchAll(PDO::FETCH_ASSOC) as $cliente) {
		    $clientes = $cliente['cnpj'] . '<br>';
		}
 
		return $clientes;
	}
	
}

Conexao.class.php
<?php

namespace classes;

/**
 * Classe Singleton para Conexao ao banco de dados
 *
 * @author Marcos de P. Muniz
 * @version 1.0
 */
class Conexao 
{

    /**
     * Instancia de conexao PDO
     * @var PDO
     */
    private static $instance = null;
    /**
     * Tipo do banco de dados
     * 
     * Pode ser:
     * <li>MySQL</li>
     * <li>PostgreSQL</li>
     * <li>SQL Server</li>
     * <li>Oracle</li>
     * <li>SQLite</li>
     * @var string
     */
    private static $dbType = "mysql";
    /**
     * Host do banco de dados
     * @var string
     */
    private static $host = "127.0.0.1";
    /**
     * Usuario de conexao ao banco de dados
     * @var string
     */
    private static $user = "root";
    /**
     * Senha de conexao ao banco de dados
     * @var string
     */
    private static $senha = "usbw";
    /**
     * Nome do banco de dados
     * @var string
     */
    private static $db = "desknfe";
    /**
     * Se a conexao deve ser persistente
     * @var boolean
     */
    protected static $persistent = false;
    /**
     * Lista de tabelas do banco de dados
     * 
     * Esta lista serve para padronizar a utilizacao das tabelas nas consultas
     * para caso seja necessario alterar o nome de alguma tabela o impacto na
     * programacao seja o minimo possivel.
     * @var array
     */
    private static $tabelas = array(
            'TB_CLIENTES' => 'clientes',
            'TB_NFE' => 'nfe'
        );   
    
    /**
     * Retorna a instancia de conexao ao banco de dados
     * 
     * Caso a instancia de conexao ja exista, apenas a retorna, caso ainda
     * nao exista, cria a instancia e a retorna.
     * 
     * @return PDO
     */
    public static function getInstance() 
    {

        if(self::$persistent != FALSE)
            self::$persistent = TRUE;
        
        if(!isset(self::$instance)){
            try {            
                
                self::$instance = new \PDO(self::$dbType . ':host=' . self::$host . ';dbname=' . self::$db
                        , self::$user
                        , self::$senha
                        , array(\PDO::ATTR_PERSISTENT => self::$persistent));
                
            } catch (\PDOException $e) {
                exit ("Erro ao conectar com o banco de dados: " . $e->getMessage());
            }
        }
        
        return self::$instance;
        
    }

    /**
     * Fecha a instancia de conexao ao banco de dados
     */
    public static function close() 
    {
        if (self::$instance != null)
            self::$instance = null;
    }
    
    /**
     * Retorna a tabela correspondente a chave informada. 
     * 
     * @param string $chave Nome da chave do array $tabelas que armazena a tabela a ser retornada
     * @return string
     */
    public static function getTabela($chave)
    {
        return self::$tabelas[$chave];
    }

}

Quando a classe Clientes é instanciada dah o seguinte erro:

Warning: require_once(classes/PDO.class.php): failed to open stream: No such file or directory in C:\DeskNFe\root\nfe\autoload.php on line 4

Fatal error: require_once(): Failed opening required 'classes/PDO.class.php' (include_path='.;C:\php\pear') in C:\DeskNFe\root\nfe\autoload.php on line 4

Utilizando fora do namespace, funciona normalmente.

Alguém pode enxergar meu erro no código?

Obg.
Jackson Dantas

Jackson Dantas

Responder

Post mais votado

24/03/2015

Na classe clientes, vc precisa ou coloca:
use PDO;

Ou então na linha 18 vc coloca a barra invertida
\PDO::FETCH_ASSOC


Provável que vc precisara colocar
use classes\Conexao;


Só lembrando. Singleton para conexão com banco de dados não e uma boa pratica..
Procure pelo padrão Registry.

Wellington Silva

Wellington Silva
Responder

Mais Posts

25/03/2015

Jackson Dantas

Wellington R. da Silva obg pela atenção dada.

As seguintes opções individualmente resolvem

Nao achei que poderia ser isso ja que o php tentava pegar a classe PDO na pasta das minhas classes
 use PDO; 

Nao atentei a essa linha q nao tinha a barra invertida
 \PDO::FETCH_ASSOC 


Quanto a chamar a classe classes\Conexao nao precisava pq estava no mesmo namespace.

E já conheço o Padrão Registry, sinceramente não lembrava dele..

Vlw mais uma vez pela atenção.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar