Вызов класса внутри другого в PHP

Надеюсь, вы можете мне помочь с этим: у меня есть два класса: база данных и пользователи. База данных подключается к базе данных с помощью PDO (внутри конструктора) и имеет функции для изменения таблиц, вставки данных и т. Д. Класс Users будет обрабатывать логин, а также добавлять / удалять пользователей. Тем не менее, классу Users необходимо подключиться к базе данных. Как я могу это сделать?

Есть несколько вещей, которые вы могли бы сделать:

Глобалы

$db = new Database(); class Users { public function foo() { global $db; $db->query(); } } 

Установка статической переменной

 $db = new Database(); class Model { static public $db; } Model::$db = $db; class Users extends Model { public function foo() { self::$db->query(); } } 

Используйте синглтон

 class Database { private static $instance; private function __construct() { } public static function instance() { return self::$instance ? self::$instance : self::$instance = new self(); } } class Users { public function foo() { Database::instance()->query(); // or $db = Database::instance(); $db->query(); } } 

Единственное, чего вы хотите избежать, это создать новое соединение с базой данных для каждой модели или класса.

Точно так же, как обычно, но это может помочь сделать базу данных свойством класса:

 <?php class Users { protected $_db; public function __construct(Database $database = null) { if (!$database) { $database = new Database; } $this->_db = $database; } public function addUser($username) { // Do stuff ... $this->_db->insert($data); } } 

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

 <?php $users = new Users; $users->addUser('joebob'); 

Просто добавьте ссылку на экземпляр класса базы данных в «Пользователи»:

 class Users { var $database; function __construct() { $this->database = new Database(); } }; 

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

Один из способов сделать это – создать ОДИН общий экземпляр класса базы данных, а затем использовать его как глобальную переменную там, где это необходимо.

Начните с создания экземпляра в любом месте вашего проекта, просто убедитесь, что он находится в глобальном пространстве (не внутри другого класса или функции).

 $DB = new Database(); 

Затем для доступа к общему объекту базы данных просто используйте встроенный массив $ GLOBALS:

 class User { function __construct() { $DB = &$GLOBALS['DB']; // do something $DB->callSomeMethod(); } ... } 

Как отметил @Ryan, конфликты пространства имен возможны с использованием этой стратегии. Лучший средний путь – преобразовать класс базы данных в одноэлементный. Затем он сохранит свой собственный экземпляр (перевод: ONE connection независимо от того, что), к которому можно получить доступ с помощью метода Database :: getInstance ().

Это класс моих пользователей:

 class Users { private $data; private $db; public function __construct() { $db = Database::getInstance('localhost', 'database', 'root', '123456'); } public function __get($key) { return $this->data[$key]; } public function __set($key, $value) { $this->data[$key] = $value; } public function test() { foreach($this->db->query('table', '*', '', '', '', '', '0,5') as $value) { $results .= $value['field1'] . "<br />"; } return $results; } }