Установить объект PHP глобальным?

Я только начал переводить свой проект из mysql в PDO. В моем проекте новый объект PDO создается более или менее правильно в начале программы.

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

Теперь я хотел бы использовать этот обработчик (это правильное имя?) В некоторых функциях и классах. Есть ли способ сделать объекты глобальными, как переменные, или я пытаюсь сделать что-то невыразимо глупо, потому что я не мог найти ничего при поиске в Интернете …

Да, вы можете сделать объекты глобальными, как и любая другая переменная:

 $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 работал правильно, имеет смысл передать его ему при создании экземпляра.

Вы будете использовать $GLOBALS['dbh_pdo'] вместо $dbh_pdo внутри любых функций. Или вы можете использовать ключевое слово global и использовать $dbh_pdo (то есть global $dbh_pdo ).

Вы также можете попробовать использовать Singleton, чтобы передать вам объект PDO. Таким образом, у вас будет только один объект PDO (и одно соединение с базой данных) в любом запросе, который сохраняет ресурсы памяти / сервера.