扩展PDO类

时间:2013-12-13 12:49:06

标签: php mysql pdo

我想开始使用PDO(从MySQL扩展转换),我想添加一些方法,但仍然拥有整个PDO功能。我想实现这样的函数:

$db->getAll("SELECT * FROM table WHERE field1=:foo AND field2=:baz", array('foo'=>$foo, 'baz'=>$baz));

我认为最好的方法是扩展PDO类,但在这种情况下,我不会让类的实例能够在类中使用它。有什么想法吗?

3 个答案:

答案 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));