Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá;
Estou tentando fazer um simples PDO Wrapper mas me deparei com o seguinte:
<?php
class Conexao extends PDO {
private $dsn = 'mysql:dbname=teste;host=127.0.0.1';
private $user = 'root';
private $password = '';
public $pdo = null;
function __construct( ) {
try {
$this->pdo = parent::__construct( $this->dsn , $this->user , $this->password );
//*
var_dump($this->pdo);
//**
var_dump($this);
return $this->pdo;
}
catch ( PDOException $e ) {
echo 'Connection failed: ' . $e->getMessage( );
return false;
}
}
}
$db = new Conexao;var_dump($db);
?>
output:
null
object(Conexao)[1]
private 'dsn' => string 'mysql:dbname=teste;host=127.0.0.1' (length=37)
private 'user' => string 'root' (length=4)
private 'password' => string '' (length=0)
public 'pdo' => null
object(Conexao)[1]
private 'dsn' => string 'mysql:dbname=teste;host=127.0.0.1' (length=37)
private 'user' => string 'root' (length=4)
private 'password' => string '' (length=0)
public 'pdo' => null
mas não estou entendendo o comportamento do script
porque isto é sempre nulo
//*
var_dump($this->pdo);
e no entanto quando eu retorno este valor consigo o objeto esperado (saida ***)
return $this->pdo;
e porque também este funciona como esperado, mesmo não referenciando a propriedade $pdo, que no caso seria ela que estaria guardando o resultado
//**
var_dump($this);
Ficaria mto agradecido se alguem pudesse me ajudar, to quebrando a cabeça faz tempo aqui e não compreendi ainda, obrigado!
>
Sua classe Conexao não precisa estender a classe PDO. Este é um uso inadequado de herança.
Concordo, se você quer registrar várias instâncias do PDO, ou se conectar com vários bancos de dados, você pode utilizar um Array Object, o que é um Array Object ? um objeto que armazena objetos
que podem ser recuperados em qualquer momento da aplicação, como também você pode setar objetos em posições específicas como um array associativo, um exemplo seria:
<?php
$Registry = new ArrayObject();
$Registry->offsetSet( 'PDO', new PDO( 'mysql:host=localhost' , 'root' , '***' ) );
$Registry->offsetSet( 'MySQLi' , new MySQLi( 'localhost' , 'root' , '***' ) );
$Registry->offsetSet( 'DOMDocument' , new DOMDocument( '1.0' , 'utf-8' ) );
print_r( $Registry );
print_r( $Registry->offsetGet( 'PDO' ) );
A Saída seria:
ArrayObject Object
(
[storage:ArrayObject:private] => Array
(
[PDO] => PDO Object
(
)
[MySQLi] => mysqli Object
(
[affected_rows] => 0
[client_info] => 5.1.41
[client_version] => 50141
[connect_errno] => 0
[connect_error] =>
[errno] => 0
[error] =>
[field_count] => 0
[host_info] => localhost via TCP/IP
[info] =>
[insert_id] => 0
[server_info] => 5.1.41
[server_version] => 50141
[sqlstate] => 00000
[protocol_version] => 10
[thread_id] => 49
[warning_count] => 0
)
[DOMDocument] => DOMDocument Object
(
)
)
)Na verdade, um simples ArrayObject não poderá ser usada em qualquer lugar da aplicação não.
Uma vez que em cada parte da aplicação uma nova instância deverá ser feita, ele não terá nada atribuída.
Isso poderia ser feito com um Singleton Registry, que na mais do que essa idéia passada pelo Andrey com a habilidade de instância única do Singleton.
Você até pode fazer o seu Registry extender ArrayObject. Se bem me lembro, o Zend_Registry (Zend Framework, caso não saiba) faz isso.
2 pontos a serem considerados:
1- o metodo construtor nunca retorna nada;
2- o vardump vai pegar todo o objeto, no momento da criacao do objeto, o q vem primeiro sao suas propriedades...e o var dump se me lembro bem so pega as propriedades e nao os metodos...pra o estado inicial eh null a saida sera null...tente criar um metodo pra pegar esta propriedade e retornar a partie deste novo metodo...
Sua classe Conexao não precisa estender a classe PDO. Este é um uso inadequado de herança.