Как получить доступ к объекту из другого класса? - PullRequest
5 голосов
/ 29 сентября 2010

У меня есть класс базы данных, который используется для выбора, обновления, удаления MySQL запросов.

Теперь я хочу создать запрос MySQL внутри другого класса, но если я определю $db = new DB(); в index.php, я не смогу использовать переменную $db в другом классе. Нужно ли определять переменную $db снова и снова, если я хочу сделать запрос? Или есть способ сделать $db переменную с глобальным объектом var?

Ответы [ 7 ]

11 голосов
/ 29 сентября 2010

Самым чистым подходом было бы агрегировать класс базы данных, когда вводит его.Все другие подходы, такие как использование ключевого слова 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;
    }
}

Используйте Конструктор Injection , если для создания действительного состояния для экземпляра требуется зависимость.Если зависимость является необязательной или должна быть взаимозаменяемой во время выполнения, используйте Setter Injection, например,

class SomeClassUsingDb
{
    protected $db;
    public function setDb($db)
    {
        $this->db = $db;
    }
}
5 голосов
/ 29 сентября 2010

Вы, вероятно, хотите синглтон .Это дает вам возможность получить экземпляр БД в любом месте кода.Затем, где бы вы ни захотели выполнить запрос, сначала выполните $db = DB::getInstance();.

. Альтернативой является внедрение зависимостей , которое передает экземпляр БД всем классам, которым он нужен.

0 голосов
/ 29 сентября 2010

Используйте магическую функцию __autoload().

0 голосов
/ 29 сентября 2010

Сначала сделайте класс вашей базы данных singleton . И тогда в вашем новом классе вы можете сделать что-то вроде:

class myNewClass{
  private $_db;

  public function  __construct(){
     $this->_db = DB::getInstance();
  }
}
0 голосов
/ 29 сентября 2010

Определите его для класса (отдельный PHP файл).Затем потребуйте его для каждого PHP-файла, в котором нужна переменная.

0 голосов
/ 29 сентября 2010

Вы можете определить его как глобальный в вашем файле index.php, а в конструкторе класса также поставить $this->db &= $GLOBALS['db'];

0 голосов
/ 29 сентября 2010

В вашем index.php файле используйте

require_once('path_to_file_with_class.php');

Вы также можете использовать include_once, который выдаст предупреждение вместо ошибки, если файл 'path_to_file_with_class.php' недоступен.

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