设置PHP对象全局?

wow*_*ick 3 php pdo global-variables

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

$dbh_pdo = new PDO("mysql:host=$db_url;dbname=$db_database_name", $db_user, $db_password);
Run Code Online (Sandbox Code Playgroud)

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

net*_*der 24

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

$pdo = new PDO('something');
function foo() {
   global $pdo;
   $pdo->prepare('...');
}
Run Code Online (Sandbox Code Playgroud)

您可能还想查看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
       }
   }
}
Run Code Online (Sandbox Code Playgroud)

应该这样做:

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
       }
   }
}
Run Code Online (Sandbox Code Playgroud)

由于TableCreator此处的类需要PDO对象才能正常工作,因此在创建实例时将其传递给它是完全合理的.