PHP-将PDO连接传递给所有函数

PHP-将PDO连接传递给所有函数,php,pdo,Php,Pdo,我有一个try-catch块,它通过PDO连接到数据库。我希望能够在所有函数中引用它,而不必将其作为参数传递。我该怎么做?上述代码是: try { $database = new PDO('mysql:host=127.0.0.1;dbname=coop1','root',''); $database->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); }catch(PDOException $e) {

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

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();
}
编辑:

我创建了一个单例类(尝试如下),它在
\u构造时执行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;
    }
}

将其声明为singleten类的静态属性。你可以用它来访问它

$pdo = Singleton::instance()->getConnection();
或者,我可以建议看一看MArtin Fowler的关系数据库映射模式。它比集中连接本身更进一步

或者,Doctirne项目有一个完整的实现:www.doctor-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();

将其声明为singleten类的静态属性。你可以用它来访问它

$pdo = Singleton::instance()->getConnection();
或者,我可以建议看一看MArtin Fowler的关系数据库映射模式。它比集中连接本身更进一步

或者,Doctirne项目有一个完整的实现:www.doctor-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();

将其声明为singleten类的静态属性。你可以用它来访问它

$pdo = Singleton::instance()->getConnection();
或者,我可以建议看一看MArtin Fowler的关系数据库映射模式。它比集中连接本身更进一步

或者,Doctirne项目有一个完整的实现:www.doctor-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();

将其声明为singleten类的静态属性。你可以用它来访问它

$pdo = Singleton::instance()->getConnection();
或者,我可以建议看一看MArtin Fowler的关系数据库映射模式。它比集中连接本身更进一步

或者,Doctirne项目有一个完整的实现:www.doctor-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();


我不会推荐它,但我不会做一个全球性的决定。类是可移植的代码单元。如果您使用该类而不将这些全局设置在外部,会发生什么情况?我不建议这样做,但我不会创建全局设置。类是可移植的代码单元。如果您使用该类而不将这些全局设置在外部,会发生什么情况?我不建议这样做,但我不会创建全局设置。类是可移植的代码单元。如果您使用该类而不将这些全局设置在外部,会发生什么情况?我不建议这样做,但我不会创建全局设置。类是可移植的代码单元。如果使用该类而不在外部设置这些全局值,会发生什么情况?我创建了singleton块(请参阅编辑的文章),并创建了一个实例:
$db=database::getInstance()
,但当我在函数中引用
$db
时,它在作用域中仍然无法识别。我做错了什么?您返回的是对singleton类itselsf(实例变量)的引用,而不是连接。请稍等,我也会添加一个编辑!因为我必须返回在那个实例中我需要的东西,在这个例子中是PDO。谢谢:)有没有一种快速的方法可以让我不必使用
$pdo=database::getInstance()->getConnection()在每个函数中?我读到,把它当作一个全局是不好的做法,你可以把它当作一个全局。之所以认为使用globals是一种不好的做法,是因为它们很容易被覆盖,而且随着项目的不断发展,您将需要越来越多的globals。容易犯错误。我通常只在配置设置中使用globals(如果您曾经使用过joomla,那么基本的joomla配置是由globals构建的)。因此,您不能简单地声明它是好是坏,但通常从长远来看,如果您计划进行持续开发,将代码粒子封装到类中是值得的。我提到的这本书读起来很好(不容易),也许可以看看itI创建了singleton块(参见编辑的文章),并创建了一个实例:
$db=database::getInstance()
,但当我在函数中引用
$db
时,它在作用域中仍然无法识别。我做错了什么?您返回的是对singleton类itselsf(实例变量)的引用,而不是连接。请稍等,我也会添加一个编辑!因为我必须返回在那个实例中我需要的东西,在这个例子中是PDO。谢谢:)有没有一种快速的方法可以让我不必使用
$pdo=database::getInstance()->getConnection()在每个函数中?我读到,把它当作一个全局是不好的做法,你可以把它当作一个全局。之所以认为使用globals是一种不好的做法,是因为它们很容易被覆盖,而且随着项目的不断发展,您将需要越来越多的globals。容易犯错误。我通常只在配置设置中使用globals(如果您曾经使用过joomla,那么基本的joomla配置是由globals构建的)。因此,您不能简单地声明它是好是坏,但通常从长远来看,如果您计划进行持续开发,将代码粒子封装到类中是值得的。我提到的这本书读起来很好(不容易),也许可以看看itI创建了singleton块(参见编辑的文章),并创建了一个实例:
$db=database::getInstance()
,但当我在函数中引用
$db
时,它在作用域中仍然无法识别。我做错了什么?您返回的是对singleton类itselsf(实例变量)的引用,而不是连接。请稍等,我也会添加一个编辑!因为我必须返回在那个实例中我需要的东西,在这个例子中是PDO。谢谢:)有没有一种快速的方法可以让我不必使用
$pdo=database::getInstance()->getConnection()在每个函数中?我读到,把它当作一个全局是不好的做法,你可以把它当作一个全局。使用globals被认为是一种不好的做法的原因是