Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 扩展PDO类_Php_Mysql_Pdo - Fatal编程技术网

Php 扩展PDO类

Php 扩展PDO类,php,mysql,pdo,Php,Mysql,Pdo,我想开始使用PDO(从MySQL扩展切换),我想添加一些方法,但仍然拥有完整的PDO功能。我想实现如下功能: $db->getAll("SELECT * FROM table WHERE field1=:foo AND field2=:baz", array('foo'=>$foo, 'baz'=>$baz)); $database->path->to->table->handler->load (\db\by('field1',$value1)

我想开始使用PDO(从MySQL扩展切换),我想添加一些方法,但仍然拥有完整的PDO功能。我想实现如下功能:

$db->getAll("SELECT * FROM table WHERE field1=:foo AND field2=:baz", array('foo'=>$foo, 'baz'=>$baz));
$database->path->to->table->handler->load (\db\by('field1',$value1)->by('field2',$field2));
namespace \path\to;
class table
{
    public $field1;
    public $field2;
}
$database = new \db\database ('mysql:host=127.0.0.1', 'test_db', 'root', '1234');
$database->add ('\path\to\table');

我认为最好的方法是扩展PDO类,但在这种情况下,我将无法在类内部使用该类的实例。有什么想法吗?

我建议不要扩展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,那么我提供了一个神奇的方法,但我不建议你采用这种方法。看


学习这类东西很有趣,但是如果你想要一个严肃的ORM,那么看看这个问题,也研究一下你自己。

我建议不要扩展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,那么我提供了一个神奇的方法,但我不建议你采用这种方法。看

做这类事情对学习来说很有趣,但如果你想要一个严肃的ORM,那么看看这个问题,并研究一下你自己。

一个单件例子:

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));
一个单独的例子:

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

在你深入研究你的项目之前,这里有一个建议给你。用ORM库来做

例如,我正在对ORM库(在本例中称为db.php)执行您需要的相同操作,如下所示:

$db->getAll("SELECT * FROM table WHERE field1=:foo AND field2=:baz", array('foo'=>$foo, 'baz'=>$baz));
$database->path->to->table->handler->load (\db\by('field1',$value1)->by('field2',$field2));
namespace \path\to;
class table
{
    public $field1;
    public $field2;
}
$database = new \db\database ('mysql:host=127.0.0.1', 'test_db', 'root', '1234');
$database->add ('\path\to\table');
ORMs的复杂之处在于,它们需要类定义来处理表,许多PHP开发人员担心数据对象的类定义。对于上面的示例,您应该需要一个类定义,如下所示:

$db->getAll("SELECT * FROM table WHERE field1=:foo AND field2=:baz", array('foo'=>$foo, 'baz'=>$baz));
$database->path->to->table->handler->load (\db\by('field1',$value1)->by('field2',$field2));
namespace \path\to;
class table
{
    public $field1;
    public $field2;
}
$database = new \db\database ('mysql:host=127.0.0.1', 'test_db', 'root', '1234');
$database->add ('\path\to\table');
在db.php ORM库的情况下进行数据库初始化,如下所示:

$db->getAll("SELECT * FROM table WHERE field1=:foo AND field2=:baz", array('foo'=>$foo, 'baz'=>$baz));
$database->path->to->table->handler->load (\db\by('field1',$value1)->by('field2',$field2));
namespace \path\to;
class table
{
    public $field1;
    public $field2;
}
$database = new \db\database ('mysql:host=127.0.0.1', 'test_db', 'root', '1234');
$database->add ('\path\to\table');
类附加到数据库对象以如下方式处理:

$db->getAll("SELECT * FROM table WHERE field1=:foo AND field2=:baz", array('foo'=>$foo, 'baz'=>$baz));
$database->path->to->table->handler->load (\db\by('field1',$value1)->by('field2',$field2));
namespace \path\to;
class table
{
    public $field1;
    public $field2;
}
$database = new \db\database ('mysql:host=127.0.0.1', 'test_db', 'root', '1234');
$database->add ('\path\to\table');
此外,许多ORM都有一个神奇的方法,允许您根据类定义自动创建或生成表,例如db.php()方法:

将在实际的mysql数据库中创建path_to_table表,其中包含两个字段field1和field2

我不知道为什么人们应该害怕PHP开发中的ORM,因为它们使每个人的生活都变得更轻松,并且在处理大型项目时,能够让您在自己的代码中不被混淆

我相信,有时候这个答案会使至少一个人免于未来的痛苦


:D

在您深入研究项目之前,这里有一条建议供您参考。用ORM库来做

例如,我正在对ORM库(在本例中称为db.php)执行您需要的相同操作,如下所示:

$db->getAll("SELECT * FROM table WHERE field1=:foo AND field2=:baz", array('foo'=>$foo, 'baz'=>$baz));
$database->path->to->table->handler->load (\db\by('field1',$value1)->by('field2',$field2));
namespace \path\to;
class table
{
    public $field1;
    public $field2;
}
$database = new \db\database ('mysql:host=127.0.0.1', 'test_db', 'root', '1234');
$database->add ('\path\to\table');
ORMs的复杂之处在于,它们需要类定义来处理表,许多PHP开发人员担心数据对象的类定义。对于上面的示例,您应该需要一个类定义,如下所示:

$db->getAll("SELECT * FROM table WHERE field1=:foo AND field2=:baz", array('foo'=>$foo, 'baz'=>$baz));
$database->path->to->table->handler->load (\db\by('field1',$value1)->by('field2',$field2));
namespace \path\to;
class table
{
    public $field1;
    public $field2;
}
$database = new \db\database ('mysql:host=127.0.0.1', 'test_db', 'root', '1234');
$database->add ('\path\to\table');
在db.php ORM库的情况下进行数据库初始化,如下所示:

$db->getAll("SELECT * FROM table WHERE field1=:foo AND field2=:baz", array('foo'=>$foo, 'baz'=>$baz));
$database->path->to->table->handler->load (\db\by('field1',$value1)->by('field2',$field2));
namespace \path\to;
class table
{
    public $field1;
    public $field2;
}
$database = new \db\database ('mysql:host=127.0.0.1', 'test_db', 'root', '1234');
$database->add ('\path\to\table');
类附加到数据库对象以如下方式处理:

$db->getAll("SELECT * FROM table WHERE field1=:foo AND field2=:baz", array('foo'=>$foo, 'baz'=>$baz));
$database->path->to->table->handler->load (\db\by('field1',$value1)->by('field2',$field2));
namespace \path\to;
class table
{
    public $field1;
    public $field2;
}
$database = new \db\database ('mysql:host=127.0.0.1', 'test_db', 'root', '1234');
$database->add ('\path\to\table');
此外,许多ORM都有一个神奇的方法,允许您根据类定义自动创建或生成表,例如db.php()方法:

将在实际的mysql数据库中创建path_to_table表,其中包含两个字段field1和field2

我不知道为什么人们应该害怕PHP开发中的ORM,因为它们使每个人的生活都变得更轻松,并且在处理大型项目时,能够让您在自己的代码中不被混淆

我相信,有时候这个答案会使至少一个人免于未来的痛苦



:D

类DB扩展PDO{}
?然后您可以使用
$this->pdoMethod()
调用PDO方法。我想到的一件事是runkit\u method\u add()。我想不出任何其他方法来向类添加方法。不要扩展,而是创建一个包装器。
classdb扩展PDO{}
?然后您可以使用
$this->pdoMethod()
调用PDO方法。我想到的一件事是runkit\u method\u add()。我想不出任何其他方法来向类添加方法。不要扩展,而是创建一个包装器。或者可以选择使用现有的库中已经在这样做的一个:)是的,或者那样,我更喜欢!很好的例子:如果可能的话,选择作文而不是继承你为什么要编辑你的答案?在内部创建PDO实例有什么问题?请参见编辑的代码@denied,您只需添加一个getter方法,以便
$PDO=$db->getPdo()$pdo->prepare()
等等……或者你可以选择使用已经在做这项工作的现有库中的一个:)Yeah或that,我更喜欢!很好的例子:如果可能的话,选择作文而不是继承你为什么要编辑你的答案?在内部创建PDO实例有什么问题?请参见编辑的代码@denied,您只需添加一个getter方法,以便
$PDO=$db->getPdo()$pdo->prepare()
等…单例是一种反模式。只是说。。。当涉及数据库连接时,参数“但在某些情况下…”无效,您可能需要也可能不需要多次使用该参数;)这让我想知道,为什么Laravel在数据库交互中一直使用单例。也许这并不像一些人所想的那样是反模式的。“Sombody使用它,它一定是最佳实践”?你在开玩笑吗?不是开玩笑。Laravel认为是当今最好的PHP框架。不过我没说“最好”。有些人确实认为二进制文件是“最好的”或“最坏的”,没有阴影。“最好的框架”是一个相当勇敢的说法。谁说的?其他的框架呢?Symfony2?ZF2?气质但是#主题:告诉我,如何访问第二个数据库?如何测试访问数据库的组件?如何摆脱实例,释放资源?///更新:我看了一下,Laravel使用的是对Re的模仿