单例 PDO 模型 - 层次结构
抱歉英语不好,我是巴西人,更糟糕的是谈论编程。 我们走吧。我有这个:
class DataBase extends PDO
{
/**
* @var object PDO
*/
private static $instance;
/**
* Cria uma instância do PDO representando a conexão ao banco de dados e torna a instância disponível como "singleton"
*
* @param string $dsn O DSN completo, ex.: mysql:host=localhost;dbname=testdb
* @param string $username O nome de usuário para a string DSN. Esse parâmetro é opcional para alguns drivers do PDO.
* @param string $password A senha para a string DSN. Esse parâmetro é opcional para alguns drivers do PDO.
* @param array $driver_options Um array key => value de opções de conexão específicas do driver
*
* @return PDO
*/
public
function __construct()
{
global $config;
$dsn = "mysql:dbname={$config['database'][AMBIENTE]['banco']};host={$config['database'][AMBIENTE]['url']}";
$username = $config['database'][AMBIENTE]['usuario'];
$password = $config['database'][AMBIENTE]['senha'];
if ( !isset ( self::$instance ) )
{
try
{
self::$instance = parent::__construct( $dsn , $username , $password );
}
catch ( PDOException $e )
{
Functions::Log( 'Erro de conexão de banco de dados: ' . $e->getMessage() );
header( 'HTTP/1.1 500 Internal Server Error' );
}
}
$this->storage = new ArrayObject();
}
public static
function getInstance()
{
if ( !self::$instance )
{
self::$instance = new DataBase;
}
return self::$instance;
}
}
以及扩展类 DataBase: 的模型:
class Model extends DataBase
{
protected $TABLE_NAME;
protected $TABLE_PREFIX;
/* all logic here, like getters, setters and methods like update, delete and insert... */
}
但我无法使用 $this 变量来访问 PDO 方法,例如查询或准备。据说即使我的 Model 类构造函数调用 getInstance,我也不会被称为 PDO 构造函数。
有可能吗?
Sorry for poor english, I'm Brazilian, and even worse talking about programming.
Let's go. I have this:
class DataBase extends PDO
{
/**
* @var object PDO
*/
private static $instance;
/**
* Cria uma instância do PDO representando a conexão ao banco de dados e torna a instância disponível como "singleton"
*
* @param string $dsn O DSN completo, ex.: mysql:host=localhost;dbname=testdb
* @param string $username O nome de usuário para a string DSN. Esse parâmetro é opcional para alguns drivers do PDO.
* @param string $password A senha para a string DSN. Esse parâmetro é opcional para alguns drivers do PDO.
* @param array $driver_options Um array key => value de opções de conexão específicas do driver
*
* @return PDO
*/
public
function __construct()
{
global $config;
$dsn = "mysql:dbname={$config['database'][AMBIENTE]['banco']};host={$config['database'][AMBIENTE]['url']}";
$username = $config['database'][AMBIENTE]['usuario'];
$password = $config['database'][AMBIENTE]['senha'];
if ( !isset ( self::$instance ) )
{
try
{
self::$instance = parent::__construct( $dsn , $username , $password );
}
catch ( PDOException $e )
{
Functions::Log( 'Erro de conexão de banco de dados: ' . $e->getMessage() );
header( 'HTTP/1.1 500 Internal Server Error' );
}
}
$this->storage = new ArrayObject();
}
public static
function getInstance()
{
if ( !self::$instance )
{
self::$instance = new DataBase;
}
return self::$instance;
}
}
and the model that extends the class DataBase:
class Model extends DataBase
{
protected $TABLE_NAME;
protected $TABLE_PREFIX;
/* all logic here, like getters, setters and methods like update, delete and insert... */
}
But I can't use the $this variable to access the PDO methods like query OR prepare. It's says that I'm not called the PDO constructor, even if my Model class constructor call getInstance.
It's possible?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
为了让你的例子工作,你可以尝试这个。
这个没有经过测试。但它应该让您了解如何解决问题。
尝试这种方法。
To make your example work, you might try this.
This is not tested. But it should give you an idea how to solve the problem.
Try this approach.
您的
getInstance()
方法和您的构造函数都分配给self::$instance
,这似乎很有趣:从
getInstance 中删除分配()
看看是否有效。Something seems funny about your
getInstance()
method and your constructor both assigning toself::$instance
:Remove the assignment from
getInstance()
and see if that works.