Array
(
    [0] => stdClass Object
        (
            [Votos_Balanceados] => 1
            [id] => 514661
            [titulo] => Chamada de metodo estatico com spl_autoload_register
            [dataCadastro] => DateTime Object
                (
                    [date] => 2015-03-24 22:24:04
                    [timezone_type] => 3
                    [timezone] => America/Sao_Paulo
                )

            [isFirstPost] => -1
            [idUsuario] => 351075
            [status] => M
            [isExample] => 
            [NomeUsuario] => Wellington R. da Silva
            [Login] => weelrs8@gmail.com
            [Apelido] => 
            [Foto] => 351075_20140709174201.jpg
            [Conteudo] => Na classe clientes, vc precisa ou coloca:
[code]
use PDO;
[/code]
Ou então na linha 18 vc coloca a barra invertida
[code]
\PDO::FETCH_ASSOC
[/code]

Provável que vc precisara colocar
[code]
use classes\Conexao;
[/code]

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

Chamada de metodo estatico com spl_autoload_register

PHP
Jackson Dantas
   - 23 mar 2015

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
#Código
<?php
include "autoload.php";

use classes\Clientes;

$cliente = new Clientes();
$getClientes = $cliente->getClientes();

echo '<pre>';
print_r($getClientes);

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

Clientes.class.php
#Código
<?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
#Código
<?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.

Post mais votado

Wellington Silva
   - 24 mar 2015

Na classe clientes, vc precisa ou coloca:
#Código
use PDO;

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


Provável que vc precisara colocar
#Código
use classes\Conexao;


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

1
|
0

Jackson Dantas
   - 25 mar 2015

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
#Código use PDO;
Nao atentei a essa linha q nao tinha a barra invertida
#Código \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.