Chamada de metodo estatico com spl_autoload_register
23/03/2015
0
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
autoload.php
Clientes.class.php
Conexao.class.php
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.
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
Curtir tópico
+ 0
Responder
Post mais votado
24/03/2015
Na classe clientes, vc precisa ou coloca:
Ou então na linha 18 vc coloca a barra invertida
Provável que vc precisara colocar
Só lembrando. Singleton para conexão com banco de dados não e uma boa pratica..
Procure pelo padrão Registry.
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
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
Nao atentei a essa linha q nao tinha a barra invertida
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.
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
Clique aqui para fazer login e interagir na Comunidade :)