PHP-扩展PHP数据对象以添加新功能



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

比如:update()、insert()、delete()、fetchAllAssoc()等…

因此,我必须在一个类中处理PDO和PDO语句对象。为了实现更新,我必须构建一个查询,prepare()it,它将返回PDO语句对象,然后我必须绑定值,然后执行。

这就是我迄今为止所做的:

<?php
    namespace DatabaseDBAL;
    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 DatabaseDBALDatabase;
$db = Database::getInstance();
$db->update("users", array("user_password" => "new password"), array("user_id" => 1));

我的问题是,这样做对吗?我在读关于装饰和立面图案的书,它看起来不是这样的。用我的方法扩展PDO类的最佳方式是什么?这些方法可以进行简单的删除、插入和获取一些数据?我希望PDO完好无损,这样我就可以像往常一样使用它…我应该使用什么模式,什么是最好的方式?

谢谢!

如果我是正确的,那么您正在实现一个反模式的活动记录模式。请注意一些ORM框架。我创建了自己的:DataContext类,它包含所有PDO stuffess(我不是在扩展PDO!),TableEntity类,它处理所有CRUD操作,Entity类是"表中的行"。

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

像Linq到SQL一样。:-)