использование глобальной переменной DB внутри классов в PHP

Как использовать глобальную переменную DB внутри класса? Допустим, у меня это в моем config.php

$dbh = new PDO("mysql:host=localhost;dbname=mydb", "root", ""); 

и я хочу использовать этот класс $ dbh внутри класса следующим образом (MyClass.php)

 class MyClass { public function DoSomething($plogin_id) { $sql = "SELECT * FROM mytable WHERE login_id = :login_id"; $stmt = $dbh->prepare($sql); //line 14 $stmt->bindParam(':login_id', $plogin_id, PDO::PARAM_STR); } } 

И внутри моего файла index.php я использую этот MyClass следующим образом:

 include "config.php"; $MyObject = new MyClass(); $login_result = $MyObject->DoSomething("admin"); 

Это дает мне ошибку:

Неустранимая ошибка: вызов функции-члена prepare () для не-объекта в C: \ xampp \ htdocs \ MyProject \ admin \ includes \ classes \ MyClass.php в строке 14

Вы должны каким-то образом передать объект $dbh в MyClass . Поскольку вы не хотите использовать глобальные переменные, я предлагаю передать его конструктору MyClass .

Ваши MyClass и index.php могут выглядеть примерно так:

 class MyClass { protected $dbh = null; public function __construct ( PDO $Pdh ) { $this->dbh = $Pdh; } public function DoSomething($plogin_id) { $sql = "SELECT * FROM mytable WHERE login_id = :login_id"; $stmt = $this->dbh->prepare($sql); //line 14 $stmt->bindParam(':login_id', $plogin_id, PDO::PARAM_STR); } } // in your index.php $MyObject = new MyClass ( $dbh ); 

Это в основном шаблон, называемый инъекцией зависимостей. См. Этот отличный учебник для получения дополнительной информации о том, что это такое.

Вы можете ввести его в свою функцию, используя:

 global $dbh; 

Однако было бы лучше добавить его в класс, например:

 class MyClass { private $dbh; public function __construct($dbh) { $this->dbh = $dbh; } public function DoSomething($plogin_id) { $sql = "SELECT * FROM mytable WHERE login_id = :login_id"; $stmt = $this->dbh->prepare($sql); //line 14 $stmt->bindParam(':login_id', $plogin_id, PDO::PARAM_STR); } } 

а потом:

 include "config.php"; $MyObject = new MyClass($dbh); // I'm assuming $dbh is created in config.php $login_result = $MyObject->DoSomething("admin"); 

Или, внесите его в свою функцию во время разговора:

 class MyClass { public function DoSomething($plogin_id, $dbh) { $sql = "SELECT * FROM mytable WHERE login_id = :login_id"; $stmt = $dbh->prepare($sql); //line 14 $stmt->bindParam(':login_id', $plogin_id, PDO::PARAM_STR); } } 

А потом:

 include "config.php"; $MyObject = new MyClass($dbh); // I'm assuming $dbh is created in config.php $login_result = $MyObject->DoSomething("admin", $dbh); 

Это наиболее распространенный метод:

 public function DoSomething($plogin_id){ global $dbh; ... 

Альтернативный подход:

Создайте синглтон для подключения к базе данных. И вы используете это вместо глобальной переменной:

 $stmt = MyDBConn::getInstance()->prepare($sql);