【问题标题】:PHP - pass PDO connection to all functionsPHP - 将 PDO 连接传递给所有函数
【发布时间】:2014-06-11 14:18:45
【问题描述】:

我有一个通过 PDO 连接到数据库的 try catch 块。我希望能够在我的所有函数中引用它,而不必将它作为参数传递。我该怎么做?提到的代码是:

try {
    $database = new PDO('mysql:host=127.0.0.1;dbname=coop1','root','');
    $database->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e) {
    echo $e->getmessage();
    die();
}

编辑:

我创建了一个单例类(下面的尝试),它在 _construct 上执行 try catch 块

final class database {

    private static $instance = NULL;


    private function __construct() {
        try {
            $database = new PDO('mysql:host=127.0.0.1;dbname=coop1','root','');
            $database->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch(PDOException $e) {
            echo $e->getmessage();
            die();
        }
    }

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

【问题讨论】:

  • 我不会推荐它,但是here
  • 我不会做一个全球性的。类是可移植的代码单元。如果您在没有外部设置这些全局设置的情况下使用该类会发生什么?

标签: php pdo


【解决方案1】:

将其声明为单例类的静态属性。比您可以使用

访问它
$pdo = Singleton::instance()->getConnection();

另外,我可以建议看一下 Martin Fowler 的关系数据库映射模式。它比集中连接本身更进一步。

Doctirne 项目也有一个完整的实现:www.doctrine-project.org

final class database {

    private static $instance = NULL;

    private $pdo;  //added private variable for pdo


    private function __construct() {
        try {
            $database = new PDO('mysql:host=127.0.0.1;dbname=coop1','root','');
            $database->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch(PDOException $e) {
            echo $e->getmessage();
            die();
        }

        $this->pdo = $database; //saved the connection into the new variable
    }

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

    //added a function to get the connection itself
    function getConnection(){
        return $this->pdo;
    }
}

所以现在你使用它:

$pdo = database::getInstance()->getConnection();

【讨论】:

  • 我创建了单例块(参见编辑后的帖子),并创建了一个实例:$db = database::getInstance();,但是当我在函数中引用$db 时,它仍然无法在范围内识别。我做错了什么?
  • 您正在返回对单例类 itselsf(实例变量)的引用,而不是连接。请稍等,我也将添加一个编辑。
  • 对!因为我必须返回在那个实例中我需要的具体内容,在这种情况下是 PDO。谢谢:)
  • 有没有一种快速的方法可以让我不必在每个函数中都使用$pdo = database::getInstance()->getConnection();?我读到将其用作全局是不好的做法
  • 您可以将其用作全局。使用全局变量被认为是一种不好的做法的原因是它们很容易被覆盖,并且随着项目的不断发展,您将需要越来越多的全局变量。容易出错。我通常仅将全局变量用于配置设置(如果您曾经使用过 joomla,则基本的 joomla 配置是由全局变量构建的)。因此,您不能只是简单地声明它是好是坏,而且通常从长远来看,如果您计划进行持续开发,将代码粒子封装到类中是值得的。嗯,我提到的这本书很好(不容易)阅读,也许看看它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多