2013-12-19 2 views
1

У меня уже есть файл базы данных, который подключается к базе данных, когда я включаю егоPHP: использовать базу данных в пределах класса

класса database.php

class dbFactory { 
    private static $host = 'some.host.com'; 
    private static $name = 'someDB'; 
    private static $user = 'someUser'; 
    private static $pass = 'somePassword'; 


    public function __construct() { } 


    public static function pdo() { 
     try { 
      # MySQL with PDO_MYSQL 
      return new PDO("mysql:host=$host;dbname=$name", $user, $pass); 
      } 
     catch(PDOException $e) { 
      echo $e->getMessage(); 
      return null; 
      exit; 
      } 
    } // End: pdo() 
} //End class 

Я обычно доступ к этому путем:

require('some-file-path' . 'class-database.php'); 
$db = dbFactory::pdo(); 

Вот вопрос: Как я могу получить доступ $db изнутри класс?

Например, если у меня есть файл класса с именем class-html.php и внутри этого класса (AKA, как часть кода класса) мне нужно что-то вроде ...:

класса html.php

class html { 
    ...some code... 
    $db->query('SELECT * FROM tbl_head'); 
    ...some more code... 
} //End: html 

Что я делал без успеха:

require('some-file-path' . 'class-database.php'); 
$db = dbFactory::pdo(); 

require('some-file-path' . 'class-html.php'); 

Я получаю сообщение об ошибке, и я не уверен, что делать здесь

+0

В этом случае оба ответа, что Мне нужно решить мою проблему. Однако этот сайт не позволяет принимать две записи в качестве ответов. Что мне делать? – Omar

ответ

1

Ваш класс внутри class-html.php может быть изменен немного, по следующим направлениям:

require('some-file-path' . 'class-database.php'); 

class SomeClass { 
    public $db; 

    def __construct() { 
    $db = dbFactory::getPDOinstance(); 
    // existing code .. 
    } 

    // other code  
} 

Затем, вы можете потребовать класс как обычно и:

require('some-file-path' . 'class-html.php'); 
$obj = new SomeClass(); 
$obj->db->query('SELECT * FROM tbl_head') 

UPDATE: Это создаст новый экземпляр PDO, если экземпляр SomeClass более чем один раз.
ОБНОВЛЕНИЕ: Используется ответ kingkero для использования существующего экземпляра dbFactory.

+0

Невозможно создать новый объект PDO для каждого объекта SomeClass, а также для таких объектов, которые отличаются от тех, которые используются в других местах. – eggyal

+0

@stoic Если экземпляр базы данных, инициированный уже, в этом случае '$ db', этот« экземпляр »не может быть доступен в другом классе (html), а другой класс (html) должен создать целый новый экземпляр базы данных? Я прав? – Omar

+0

Нет, вы можете «сохранить» экземпляр внутри вашего dbFactory. Вы можете узнать больше об этом в [wiki link, которую я разместил] (https://en.wikipedia.org/wiki/Singleton_pattern) – kero

2

Вы можете использовать Singleton class

class dbFactory { 

    //... 
    private static $pdo_instance = null; 

    private static function getPDOinstance() { 
     if (self::$pdo_instance === null) { 
      try { 
       self::$pdo_instance = new PDO("..."); 
      } catch (PDOException $e) { 
       //... 
      } 
     } 
     return self::$pdo_instance; 
    } 

} 

Когда вы теперь получить доступ к dbFactory::getPDOinstance() вы будете иметь только один экземпляр PDO создания новых внутри каждого класса с помощью DB

Смежные вопросы