Как использовать глобальную переменную 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);