Я только начал переводить свой проект из 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 (и одно соединение с базой данных) в любом запросе, который сохраняет ресурсы памяти / сервера.