我想开始使用PDO(从MySQL扩展转换),我想添加一些方法,但仍然拥有整个PDO功能。我想实现这样的函数:
$db->getAll("SELECT * FROM table WHERE field1=:foo AND field2=:baz", array('foo'=>$foo, 'baz'=>$baz));
我认为最好的方法是扩展PDO类,但在这种情况下,我不会让类的实例能够在类中使用它。有什么想法吗?
答案 0 :(得分:4)
我建议不要扩展PDO,而是创建一个围绕它的库/包装器,这是其他ORM所做的。
我将把你的示例代码构建成一个简单的类来解释。
class MyDB
{
private $pdo;
public function __construct(PDO $pdo)
{
$this->pdo = $pdo;
}
public function getAll($query, array $params)
{
$statement = $this->pdo->prepare($query);
$statement->execute($params);
return $statement->fetchAll();
}
public function getPdo()
{
return $this->pdo;
}
/**
* This is called if the method cannot be found.
* Pass it to PDO to handle.
*
* @param $name
* @param $arguments
*/
public function __call($name, $arguments)
{
return call_user_func(array($this->pdo, $name), $arguments)
}
}
如果您真的想直接访问PDO,那么我已经提供了一种神奇的方法,但我不建议您采取这种方式。见http://www.php.net/manual/en/language.oop5.magic.php
做这类事情对于学习来说很有趣,但是如果你想要一个严肃的ORM,那么请看看这个问题Good PHP ORM Library?并自己研究。
答案 1 :(得分:0)
在你深入了解你的项目之前,这是一个给你的建议。用ORM库做。
例如,我正在使用ORM库(在本例中称为db.php)执行相同的操作,如下所示:
$database->path->to->table->handler->load (\db\by('field1',$value1)->by('field2',$field2));
ORM的复杂之处在于它们需要类定义来处理表,而许多PHP开发人员都害怕数据对象的类定义。对于上面的例子来说,你应该需要一个像这样的类定义:
namespace \path\to;
class table
{
public $field1;
public $field2;
}
在db.php ORM库的情况下进行数据库初始化,如下所示:
$database = new \db\database ('mysql:host=127.0.0.1', 'test_db', 'root', '1234');
附加到数据库对象的类就像这样处理:
$database->add ('\path\to\table');
此外,许多ORM都有一个神奇的方法,允许您根据类定义自动创建或生成表,例如db.php(http://dbphp.net)方法:
$database->update();
将在您的实际mysql数据库中创建path_to_table表,其中包含2个字段field1和field2。
我不确定为什么人们应该害怕PHP开发中的ORM,它们使每个人的生活更轻松,并且在您从事大型项目时,不会让自己的代码感到困惑。
我相信有时候这个答案至少可以拯救未来的人类。
:D
答案 2 :(得分:-5)
单身例子:
class DB
{
protected static $instance = null;
final private function __construct() {}
final private function __clone() {}
public static function instance()
{
if (self::$instance === null)
{
$dsn = 'mysql:host='.DB_HOST.';dbname='.DB_NAME;
self::$instance = new PDO($dsn, DB_USER, DB_PASS);
self::$instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
return self::$instance;
}
public static function __callStatic($method, $args) {
return call_user_func_array(array(self::instance(), $method), $args);
}
public static function getAll($sql, $data = NULL, $mode = PDO::FETCH_ASSOC)
{
$stmt = self::instance()->prepare($sql);
$stmt->execute($data);
return $stmt->fetchAll($mode);
}
}
$sql = "SELECT * FROM table WHERE field1=:foo AND field2=:baz";
$data = DB::getAll($sql, array('foo'=>$foo, 'baz'=>$baz));