Установить глобальный объект PHP? - PullRequest
3 голосов
/ 15 января 2011

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

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

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

Ответы [ 3 ]

24 голосов
/ 15 января 2011

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

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

4 голосов
/ 15 января 2011

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

0 голосов
/ 16 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...