Я новичок в ООП. Первоначально я определял переменные и присваивал им значения внутри класса и вне конструктора, но после урока ООП в 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' );
Надеюсь, это указывает на то, что вы в правильном направлении! Удачи!
Прежде всего: это бессмысленно.
Вы создаете обертку объекта для 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(); ?>