PHP: метод конструктора классов подключения к базе данных

Я новичок в ООП. Первоначально я определял переменные и присваивал им значения внутри класса и вне конструктора, но после урока ООП в Java сегодня мне сказали, что это плохой стиль, и его следует избегать.

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

class DatabaseConnection { private $dbHost = "localhost"; private $dbUser = "root"; private $dbPass = ""; private $dbName = "test"; function __construct() { $connection = mysql_connect($this->dbHost, $this->dbUser, $this->dbPass) or die("Could not connect to the database:<br />" . mysql_error()); mysql_select_db($this->dbName, $connection) or die("Database error:<br />" . mysql_error()); } } 

Является ли вышеуказанное хорошо? Или лучший способ?

 class DatabaseConnection { private $dbHost; private $dbUser; private $dbPass; private $dbName; function __construct() { $this->dbHost = "localhost"; $this->dbUser = "root"; $this->dbPass = ""; $this->dbName = "test"; $connection = mysql_connect($this->dbHost, $this->dbUser, $this->dbPass) or die("Could not connect to the database:<br />" . mysql_error()); mysql_select_db($this->dbName, $connection) or die("Database error:<br />" . mysql_error()); } } 

Что я должен делать, чтобы убедиться, что я правильно понимаю ООП?

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

 $dbHost = "localhost"; 

Должно быть

 $this->dbHost = 'localhost'; 

Обычно я не помещаю свои параметры входа в класс. Я должен передать их в конструктор, когда объект будет создан. Используйте внешний файл конфигурации, чтобы вы могли использовать этот класс более чем для одной сборки. 🙂

Обновить::

Итак, вот несколько небольших золотых набросков конфигурации ООП, которые помогут вам построить динамический класс базы данных.

  • Посмотрите http://redbeanphp.com/ Это позволит вам использовать стиль PSUDO ORM для моделирования данных. Супер прост в установке, и смешно легко получить базу данных. http://redbeanphp.com/manual/installing

  • Создайте файл конфигурации, который содержит такие вещи, как константы, настройки шаблонов, общие функции и файлы конфигурации AUTOLOADER являются ключевыми при работе в средах, контролируемых версиями. 🙂

  • Создайте свой класс базы данных как абстрактный класс http://php.net/manual/en/language.oop5.abstract.php

     abstract class Database { public function update() { } public function deactivate() { } public function destroy() { } //etc. } class MyAppObject extends Database { } 
  • Поместите все ваши файлы классов в папку библиотеки, а затем поместите свой файл конфигурации в эту библиотеку. Теперь, чтобы упростить вашу жизнь, вы можете использовать функцию автозагрузчика, чтобы оживить ваши классы, когда вам это нужно, без необходимости включать какой-либо конкретный класс. Смотри ниже:

     //note: this is never explicitly instantiated //note: name your files like this: MyAppObject.class.php function my_fancypants_autoloader( $my_class_name ) { if( preg_match( "%^_(Model_)%", $my_class_name ) ) return; require_once( "$my_class_name.class.php" ); } spl_autoload_register( 'my_fancypants_autoloader' ); 
    • Теперь все, что вам нужно сделать, это включить один файл конфигурации в ваши .php-файлы для доступа к вашим классам.

Надеюсь, это указывает на то, что вы в правильном направлении! Удачи!

Прежде всего: это бессмысленно.

Вы создаете обертку объекта для 10+ mysql_* функции mysql_* . Это расширение php больше не поддерживается, и процесс устаревания уже начался . Вы не должны использовать этот API для любых новых проектов в 2012 году.

Вместо этого вы должны научиться использовать PDO или MySQLi и работать с подготовленными операторами .

Тем не менее .. позволяет взглянуть на ваш код:

  • Конструктор должен получить все параметры, необходимые для создания нового экземпляра, параметры не должны быть жестко закодированы в определении класса. Что делать, если вам нужно одновременно работать с двумя базами данных?
  • Когда соединение создается, оно должно храниться в переменной области объекта. Что-то вдоль линий $this->connection = mysql_conn... Вместо этого вы храните его в локальной переменной, которую вы «теряете» сразу после завершения конструктора.
  • Вы не должны использовать private переменные для всего. Они не видны классам, которые расширят ваш первоначальный класс. Если это не преднамеренно, вы должны выбрать protected для этого.
  • Бит or die('..') бит больше всего идут. Не прекращайте работу приложения в случае сбоя соединения. Вместо этого вы должны выставить исключение , которое затем можно обрабатывать вне конструктора.

Поскольку вы используете их только в методе __construct , вам не нужны эти атрибуты класса. Для последующего использования imho необходимо сохранить только $connection .

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

 $db = new DatabaseConnection("localhost", "user", "password", "db"); 

Они уже много инструментов PHP для этого, находят их, читают и учатся на этом. Прежде всего, использование PDO и то, что истинно в Java, не всегда верно в PHP.

Последнее, вероятно, лучше, но с настройкой: передать некоторые аргументы конструктору, а именно информацию о соединении.

Ваш первый пример полезен только в том случае, если у вас есть одно соединение с базой данных, и только если вы счастливы жестко кодировать значения соединения (вам не следует). Второй пример: если вы добавляете say, параметр $name в качестве аргумента, можно использовать для подключения к нескольким базам данных:

Я новичок в ООП. Первоначально я определял переменные и присваивал им значения внутри класса и вне конструктора, но после урока ООП в Java сегодня мне сказали, что это плохой стиль, и его следует избегать.

 class DatabaseConnection { private $dbHost; private $dbUser; private $dbPass; private $dbName; function __construct($config) { // Process the config file and dump the variables into $config $this->dbHost = $config['host']; $this->dbName = $config['name']; $this->dbUser = $config['user']; $this->dbPass = $config['pass']; $connection = mysql_connect($this->dbHost, $this->dbUser, $this->dbPass) or die("Could not connect to the database:<br />" . mysql_error()); mysql_select_db($this->dbName, $connection) or die("Database error:<br />" . mysql_error()); } } 

Поэтому, используя этот стиль, теперь у вас есть более полезный класс.

Вот моя, и она работает довольно хорошо:

 class Database { private static $_dbUser = 'user'; private static $_dbPass = 'pwd'; private static $_dbDB = 'dbname'; private static $_dbHost = 'localhost'; private static $_connection = NULL; /** * Constructor * prevents new Object creation */ private function __construct(){ } /** * Get Database connection * * @return Mysqli */ public static function getConnection() { if (!self::$_connection) { self::$_connection = @new mysqli(self::$_dbHost, self::$_dbUser, self::$_dbPass, self::$_dbDB); if (self::$_connection -> connect_error) { die('Connect Error: ' . self::$_connection->connect_error); } } return self::$_connection; } } 

Делая __construct пустым, он предотвращает создание экземпляра нового класса из любого места. Затем сделайте функцию static так что теперь все, что мне нужно сделать, чтобы получить мое соединение, это Database::getConnection() И все это в включенном файле, в папке с паролем на сервере и просто включается в каждый файл класса. Это также проверяет, открыто ли соединение, прежде чем пытаться выполнить другое. Если он уже установлен, он передает открытое соединение методу.

 <?php class config { private $host='localhost'; private $username='root'; private $password=''; private $dbname='khandla'; function __construct() { if(mysql_connect($this->host,$this->username,$this->password)) { echo "connection successfully"; } } function db() { mysql_select_db($this->$dbname); } } $obj=new config(); ?>