Как получить доступ к объекту из другого класса?
У меня есть класс базы данных, который используется для выбора, обновления, удаления MySQL запросов.
Теперь я хочу создать запрос MySQL внутри другого класса, но если я определяю $db = new DB();
в index.php
, я не могу использовать var $db
в другом классе. Должен ли я определять переменную $db
снова и снова, если я хочу сделать запрос? Или есть способ сделать $db
var с объектом global var?
Ответы
Ответ 1
Самый чистый подход - aggregate класс базы данных, где необходимо инъекции. Все другие подходы, например, используя ключевое слово global
или используя static
, не говоря уже о Singleton, вводит жесткую связь между вашими классами и глобальным охватом, что делает приложение сложнее тестировать и поддерживать. Просто сделайте
// index.php
$db = new DBClass; // create your DB instance
$foo = new SomeClassUsingDb($db); // inject to using class
и
class SomeClassUsingDb
{
protected $db;
public function __construct($db)
{
$this->db = $db;
}
}
Используйте Инъекция конструктора, если для создания допустимого состояния для экземпляра требуется зависимость. Если зависимость является необязательной или должна быть взаимозаменяемой во время выполнения, используйте Setter Injection, например
class SomeClassUsingDb
{
protected $db;
public function setDb($db)
{
$this->db = $db;
}
}
Ответ 2
Вероятно, вы хотите singleton. Это дает вам возможность получить экземпляр DB в любом месте кода. Затем в любом месте, где вы хотите выполнить запрос, сначала сделайте $db = DB::getInstance();
.
Альтернативой является инъекция зависимостей, которая передает экземпляр БД всем классам, которые нуждаются в нем.
Ответ 3
В вашем файле index.php
используйте
require_once('path_to_file_with_class.php');
Вы также можете использовать include_once
, который даст вам предупреждение вместо ошибки, если файл path_to_file_with_class.php недоступен.
Ответ 4
Определите его в классе (отдельный PHP файл). Затем требуйте его для каждого файла PHP, в котором требуется var.
Ответ 5
Сначала сделайте свой класс базы данных singleton. А затем в новом классе вы можете сделать что-то вроде:
class myNewClass{
private $_db;
public function __construct(){
$this->_db = DB::getInstance();
}
}
Ответ 6
Используйте магическую функцию __autoload()
.
Ответ 7
Вы можете определить его как глобальный в вашем файле index.php, а в конструкторе класса также введите $this->db &= $GLOBALS['db'];