PHP: метод конструктора класса соединения с базой данных - PullRequest
2 голосов
/ 30 марта 2012

Я новичок в ООП. Первоначально я определял переменные и присваивал им значения внутри класса и вне конструктора, но сегодня после урока ООП в 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());
    }
}

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

Ответы [ 6 ]

9 голосов
/ 30 марта 2012

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

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

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

При этом .. давайте взглянем на ваш код:

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

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

$dbHost = "localhost";

Должно быть

$this->dbHost = 'localhost';

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

Обновление ::

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

  • Извлечение http://redbeanphp.com/ Это позволит вам выполнять моделирование данных в стиле psuedo 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 для доступа к вашим классам.

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

1 голос
/ 30 марта 2012

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

Ваш первый пример полезен, только если у вас есть одно соединение с базой данных, и только если выВы довольны жестким кодированием значений соединения (не должно быть).Второй пример, если вы добавите, скажем, параметр $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());
    }
}

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

0 голосов
/ 18 июля 2012
<?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();
?>
0 голосов
/ 30 марта 2012

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

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, он предотвращает создание нового класса из любого места.Затем сделайте функцию статической, чтобы теперь все, что мне нужно сделать, чтобы установить соединение, это Database::getConnection(). И все это в файле include, в защищенной паролем папке на сервере и просто включенном в каждый файл класса.Это также проверит, если соединение уже открыто, прежде чем пытаться другое.Если он уже установлен, он передает открытое соединение методу.

0 голосов
/ 30 марта 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...