设置PHP对象全局?

时间:2011-01-14 21:34:05

标签: php pdo global-variables

我刚刚开始将我的项目从mysql切换到PDO。在我的项目中,一个新的PDO对象或多或少地创建在程序的开头。

$dbh_pdo = new PDO("mysql:host=$db_url;dbname=$db_database_name", $db_user, $db_password);

现在我想在一些函数和类中使用这个处理程序(是正确的名字吗?)。有没有办法让对象像变量一样全局化,或者我尝试了一些难以言喻的愚蠢的东西,因为我在搜索网页时找不到任何东西......

3 个答案:

答案 0 :(得分:24)

是的,您可以像任何其他变量一样使对象变为全局:

$pdo = new PDO('something');
function foo() {
   global $pdo;
   $pdo->prepare('...');
}

您可能还想查看Singleton模式,它基本上是一种全局的OO风格。

话虽这么说,我建议你不要使用全局。在调试和测试时,它们可能会很痛苦,因为很难分辨谁修改/使用/访问它,因为一切都可以。他们的使用通常被认为是一种不好的做法考虑稍微检查一下你的设计。

我不知道您的应用程序是什么样的,但是说你这样做了:

class TableCreator {
   public function createFromId($id) {
       global $pdo;
       $stmt = $pdo->prepare('SELECT * FROM mytable WHERE id = ?');
       $stmt->execute(array($id));
       $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
       foreach ($rows as $row) {
           // do stuff
       }
   }
}

应该>而不是:

class TableCreator {
   protected $pdo;

   public function __construct(PDO $pdo) {
       $this->pdo = $pdo;
   }

   public function createFromId($id) {
       $stmt = $this->pdo->prepare('SELECT * FROM mytable WHERE id = ?');
       $stmt->execute(array($id));
       $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
       foreach ($rows as $row) {
           // do stuff
       }
   }
}

由于这里的TableCreator类要求PDO对象正常工作,因此在创建实例时将其传递给它是完全合理的。

答案 1 :(得分:4)

您将在任何功能中使用$GLOBALS['dbh_pdo']而不是$dbh_pdo。或者您可以使用全局关键字,并使用$dbh_pdo(即global $dbh_pdo)。

答案 2 :(得分:0)

您也可以尝试使用Singleton将PDO对象传回给您。这样,您在任何请求中只有一个PDO对象(和一个数据库连接),可以节省内存/服务器资源。