Как получить доступ к объекту из другого класса?

У меня есть класс базы данных, который используется для выбора, обновления, удаления 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'];