【问题标题】:PHP - extending PHP Data Object to add new functionalityPHP - 扩展 PHP 数据对象以添加新功能
【发布时间】:2012-03-17 19:49:09
【问题描述】:

所以这就是我想要实现的目标。 我想使用 PDO,我喜欢它,但我想在 PDO 之上添加一些新方法。

如:update()、insert()、delete()、fetchAllAssoc() 等...

所以我必须在一个类中同时使用 PDO 和 PDO 语句对象。 因为要实现更新,我必须构建一个查询,prepare() 它,它会返回 PDO 语句对象,然后我必须绑定值然后执行。

这是我到目前为止所做的:

<?php

    namespace Database\DBAL;
    use PDO;

    class Database extends PDO
    {            
        protected static $instance;

        public static function getInstance()
        {
            if(empty(static::$instance))
            {
                // This will be fetched from config
                $dns = "mysql:host=localhost;dbname=db_name";             
                $username = "root";
                $password = "my_pwd";
                static::$instance = new Database($dns, $username, $password);

            }
            return static::$instance;
        }

        /**
         * Detect param type
         */

        protected function detectType($value)
        {
            if(is_string($value))
            {
                return PDO::PARAM_STR;
            } 
            else if(is_int($value))
            {
                return PDO::PARAM_INT;
            }                            
            else if(is_null($value))
            {
                return PDO::PARAM_NULL;
            }
            else if(is_bool($value))
            {
                return PDO::PARAM_BOOL;
            }
            else
            {
                return false;    
            }
        }        

        /**
         * Updates table
         */

        public function update($table, $data, $identifier)
        {

            $set = array();

            foreach ($data as $columnName => $columnValue) {
                $set[] = $columnName . ' = ?';
            }

            $query  = 'UPDATE ' . $table . ' SET ' . implode(', ', $set) . ' WHERE ' . implode(' = ? AND ', array_keys($identifier)) . ' = ?';  
            $params = array_merge(array_values($data), array_values($identifier));

            array_unshift($params, null);
            unset($params[0]);

            echo $query;

            $pdos = static::$instance->prepare($query);

            foreach($params as $key => $param)
            {
                $pdos->bindValue($key, $param, $this->detectType($param));
            }

            return $pdos->execute();

        }

    }

?>

你会这样使用它:

use Database\DBAL\Database;
$db = Database::getInstance();
$db->update("users", array("user_password" => "new password"), array("user_id" => 1));

我的问题是,这是正确的做法吗? 我正在阅读有关装饰器和外观模式的信息,它看起来像这样。 用我的方法扩展 PDO 类的最佳方法是什么?这些方法可以进行简单的删除、插入和获取一些数据?而且我希望 PDO 完好无损,所以我可以像往常一样使用它...我应该使用什么模式,最好的方法是什么?

谢谢!

【问题讨论】:

  • 您是否考虑使用类似 orm 的学说?
  • 不是真的,我使用了 Doctrine DBAL,我喜欢它,但我认为它可以变得更好,就 DBAL API 而言。我不需要 ORM,也不需要 DBAL,但我需要更多的方法,这样我就可以更容易地获取数据,而且我需要从 SQL 注入中保护所有内容,而 Doctrine DBAL 并非如此。所以我想构建一些类似于 Doctrine DBAL 的东西,但更简单,增加了一些 PDO 的功能,我所需要的只是找到我应该使用哪些模式以及扩展 PDO 的最佳方式。

标签: php database pdo


【解决方案1】:

如果我是正确的,您正在实施作为反模式的活动记录模式。请注意一些 ORM 框架。 我创建了我自己的:包含所有 PDO 内容的 DataContext 类(我没有扩展 PDO!),处理所有 CRUD 操作的 TableEntity 类和“表中的行”的实体类。

$dc = new TestDataContext(...);
$dc->users()->Where(column, 1, '=')->...
$dc->users()->InsertOnSubmit(new User())
$dc->SubmitChanges();

像 Linq to SQL。 :-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    相关资源
    最近更新 更多