2010-09-29 3 views
5

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

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

ответ

0

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

require_once('path_to_file_with_class.php'); 

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

-1

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

5

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

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

+0

Пример для одноплодного шаблона в PHP можно найти здесь: http://www.weberdev.com/get_example-4002.html – Zilverdistel

+0

Чтобы сделать объект глобально доступным вам нужен только статический метод для его экземпляра , Это не должно быть Singleton. Оба являются вонючими, поэтому Injection Dependency - это путь. – Gordon

0

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

0

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

class myNewClass{ 
    private $_db; 

    public function __construct(){ 
    $this->_db = DB::getInstance(); 
    } 
} 
0

Используйте волшебную функцию __autoload().

11

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

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

class SomeClassUsingDb 
{ 
    protected $db; 
    public function setDb($db) 
    { 
     $this->db = $db; 
    } 
} 
+0

И как именно я использую переменную $ db, чем? $ This-> db-> выберите(); ? – Mike

+0

@Mike да, точно так же. Или через геттер (если вы его написали) – Gordon