如何跨多个类访问PDO连接对象?[php+;Mysql]

如何跨多个类访问PDO连接对象?[php+;Mysql],php,mysql,pdo,Php,Mysql,Pdo,我想在php中使用PDO实现mysql连接。我需要有PDO连接对象,它必须在多个文件上可用。数据库连接也必须是类。在这里找到的许多答案并不令人满意。请解释实现该目标的正确方法 我目前采用的方法是: 文件名:connectClass.php <?php ini_set('display_errors',1); ini_set('display_startup_errors',1); error_reporting(-1); class connect { public $db;

我想在php中使用PDO实现mysql连接。我需要有PDO连接对象,它必须在多个文件上可用。数据库连接也必须是类。在这里找到的许多答案并不令人满意。请解释实现该目标的正确方法

我目前采用的方法是: 文件名:connectClass.php

<?php
ini_set('display_errors',1);
ini_set('display_startup_errors',1);
error_reporting(-1);
class connect
{
    public $db;
    public $isConnected;
    public function __construct()
    {
        $this->isConnected = true;
        try { 
            $this->db=new PDO('mysql:host=localhost;dbname=dbname','root','rootpass');
            $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $this->db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
        }
        catch(PDOException $e) { 
            $this->isConnected = false;
            throw new Exception($e->getMessage());
        }
    }
}
$obj=new connect();
?>
<?php
include_once 'class/connectClass.php';
class addContent extends connect
{
    public function insertContent($title, $content, $page_title, $meta_tags) {
        try {
            $qry = $this->db->prepare("INSERT INTO tblPageContents (PageName, PageTitle, PageMeta, PageKeyWords, PageContents, PageFooter, PageShortName) VALUES (?, ?, ?, ?, ?, ?, ?)");
            $data = array($title, $content, $page_title, $meta_tags);
            $qry->execute($data);  
            echo "<div id=\"dialog-ci\" title=\"Content updation success\" style=\"color:green\">Content insertion success</div>";
        }
        catch(PDOException $e)
        {
            echo 'Query failed'.$e->getMessage();
        }
    }
}
?>

在中访问连接对象 文件名:addContentClass.php

<?php
ini_set('display_errors',1);
ini_set('display_startup_errors',1);
error_reporting(-1);
class connect
{
    public $db;
    public $isConnected;
    public function __construct()
    {
        $this->isConnected = true;
        try { 
            $this->db=new PDO('mysql:host=localhost;dbname=dbname','root','rootpass');
            $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $this->db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
        }
        catch(PDOException $e) { 
            $this->isConnected = false;
            throw new Exception($e->getMessage());
        }
    }
}
$obj=new connect();
?>
<?php
include_once 'class/connectClass.php';
class addContent extends connect
{
    public function insertContent($title, $content, $page_title, $meta_tags) {
        try {
            $qry = $this->db->prepare("INSERT INTO tblPageContents (PageName, PageTitle, PageMeta, PageKeyWords, PageContents, PageFooter, PageShortName) VALUES (?, ?, ?, ?, ?, ?, ?)");
            $data = array($title, $content, $page_title, $meta_tags);
            $qry->execute($data);  
            echo "<div id=\"dialog-ci\" title=\"Content updation success\" style=\"color:green\">Content insertion success</div>";
        }
        catch(PDOException $e)
        {
            echo 'Query failed'.$e->getMessage();
        }
    }
}
?>


这段代码的问题是每次我都需要使用extends。

单例方法可以这样实现

<?php
class Connect {
    public $db;
    public $isConnected;
    public static $instance = null;

    public static function getInstance() {
        if (self::$instance == null) self::$instance = new static();
        return self::$instance;
    }

    private function __construct() {
        $this->isConnected = true;
        try { 
            $this->db = new PDO('mysql:host=localhost;dbname=dbname','root','rootpass');
            $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $this->db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
        }catch(PDOException $e) { 
            $this->isConnected = false;
            throw new Exception($e->getMessage());
        }
    }
}

class AddContent {
    public function insertContent($title, $content, $page_title, $meta_tags) {
        try {
            $qry = Connect::getInstance()->db->prepare("INSERT INTO tblPageContents (PageName, PageTitle, PageMeta, PageKeyWords, PageContents, PageFooter, PageShortName) VALUES (?, ?, ?, ?, ?, ?, ?)");
            $data = array($title, $content, $page_title, $meta_tags);
            $qry->execute($data);  
            echo "<div id=\"dialog-ci\" title=\"Content updation success\" style=\"color:green\">Content insertion success</div>";
        }
        catch(PDOException $e)
        {
            echo 'Query failed'.$e->getMessage();
        }
    }
}

使用DI的优点是,类不需要知道使用哪个实现来存储数据,无论是使用PDO还是使用MongoDB。它只需要知道它可以使用哪些函数(例如connect/execute/…)

U总是可以使用单例方法。这样你可以从任何地方访问对象,注意这不是最合适的方法。依赖性注射更好…@DarkBee感谢您的快速响应。您可以提供一个包含两个文件的示例。在另一个类的构造函数中提供连接变量(实例)。@KrishnadasPC您可能会发现这种方法很有用:注意这个
self::$static=new static();return self::$instance
我真的对依赖注入感到困惑。不知道如何在PDO类中实现它。如果可能,您也可以提供一个DI示例。这是DI:
公共函数uuu构造(PDO$db)
-当您将依赖的类(PDO)插入到类中时。