类内PDO合并


PDO incorporation within class

我有一些问题理解这一点。我想开始重写一些旧的MySQL函数代码PDO。它的设置方式是,一个外部文件包含这一行(以及其他内容):

// db.php file   
$DB = new dbConnect(SERVER,DB,USER,PASSWORD,3306);
function my_autoloader($class)
{
    require_once ($_SERVER['DOCUMENT_ROOT']."/includes/".'class.' . $class . '.php' );
}
spl_autoload_register('my_autoloader');

将创建到我的数据库的连接。这包含在我的页面的顶部,也会加载我所有的类。现在,如果我想使用PDO创建一个新连接,我将执行以下操作:

$conn = new PDO('mysql:host='.SERVER.';dbname='.DB.';charset=utf8',USER, PASSWORD);

但是,我不能在单独的文件上有这行代码,并从类中调用PDO,像下面这样:

require_once 'db.php';
class info
{
    protected $ID;
    public function __construct($id)
    {
        $this->ID = $id; // 
    }
    public function getName()
    {
        $query = "SELECT * FROM job";
        $q = $conn->query($query);
        $data = $q->fetch(PDO::FETCH_ASSOC);
            //do something with $data
    }
}

这是否意味着我必须像下面这样通过聚合在构造函数中建立连接?

require_once 'db.php';
class info
{
    protected $ID;
    protected $pdo;
    public function __construct($id)
    {
        $this->ID = $id; // 
        $this->pdo = new PDO('mysql:host='.SERVER.';dbname='.DB.';charset=utf8',USER, PASSWORD);
    }
    public function getName()
    {
        $query = "SELECT * FROM job";
        $q = $this->pdo->query($query);
        $data = $q->fetch(PDO::FETCH_ASSOC);
        // do something
    }
}

或者有另一种我不知道的方法。重新编写所有的类来包含这个似乎很乏味。

与其在构造函数中创建数据库连接,不如让它成为一个依赖项:

public function __construct(PDO $db, $id)
{
    $this->pdo = $db;
    $this->ID = $id;
}

要使用它,你可以这样做:

// $db = new PDO('mysql:host='.SERVER.';dbname='.DB.';charset=utf8',USER, PASSWORD);
$info = new info($db, '123');
echo $info->getName();

这种方法的主要优点是您不再在类中存储任何配置。此外,您还可以传递任何实现PDO的内容,从而启用模拟数据库的单元测试。

创建到数据库的连接时,应该在单例类中创建。您只需要打开到数据库的一个连接。例如:

public class database
{
    static $instance;
    public static function getInstance()
    {
          if($self::$instance == null)
          {
                $self::$instance = new PDO(); // string value here.
          }
          return $instance;
    }
}

然后你可以在你的类的任何地方调用database::getInstance()方法,你不需要一直重写你的连接代码。

PS:我知道这个单例不是线程安全的。我只是想向op强调这个概念。

这是我的第一次尝试:

class database extends PDO {
        protected static $instance;
        protected function __construct(){}
        public static function getInstance()
        {
            if(empty(self::$instance))
            {
                 $db_info = array(
                                "db_host" => SERVER,
                                "db_port" => PORT,
                                "db_user" => USER,
                                "db_pass" => PASSWORD,
                                "db_name" => DB);
                 self::$instance = new Database("mysql:host=".$db_info['db_host'].';port='.$db_info['db_port'].';dbname='.$db_info['db_name'], $db_info['db_user'], $db_info['db_pass']);
             }
             return self::$instance;
        }
}
class info
{
    protected $ID;
    protected $pdo;
    public function __construct($id)
    {
        $this->ID = $id; // 
        $this->pdo = database::getInstance();
    }
    public function getName()
    {
        $query = "SELECT * FROM job";
        $q = $this->pdo->query($query);
        $data = $q->fetch(PDO::FETCH_ASSOC);
        // do something
    }
}

我不完全确定这是否正确,因为我目前没有测试这一点的方法。这是正确的吗?