php синглтон соединение с базой данных, этот код плохая практика? - PullRequest
5 голосов
/ 10 февраля 2012

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

Вот класс

class Database {
private $databaseName = 'dbname';
private $host = 'localhost';
private $user = 'user';
private $password = 'pass'; 
private static $instance; //store the single instance of the database

private function __construct(){
    //This will load only once regardless of how many times the class is called
    $connection = mysql_connect($this->host, $this->user, $this->password) or die (mysql_error());
    $db = mysql_select_db($this->databaseName, $connection) or die(mysql_error()); 
    echo 'DB initiated<br>';
}

//this function makes sure there's only 1 instance of the Database class
public static function getInstance(){
    if(!self::$instance){
        self::$instance = new Database();
    }
    return self::$instance;     
}

public function connect() { 
    //db connection
} 
public function query($query) {
    //queries   
    $sql = mysql_query($query) or die(mysql_error()); 
    return $sql;
}

public function numrows($query) {
    //count number of rows  
    $sql = $this->query($query);
    return mysql_num_rows($sql);
}


}

//Intantiate the class
$database = Database::getInstance();

, и когда я захочу использовать класс, я сделаю:

$query = "SELECT * FROM registrations";
echo $database->numrows($query);
$sql = $database->query($query);

Ответы [ 4 ]

12 голосов
/ 10 февраля 2012

Синглтоны - плохие новости.

  • Они вводят глобальное состояние в программу.Большинство программистов должны знать, почему глобальное состояние плохо.
  • Они вводят тесную связь между синглтоном и любым классом, который его использует.Это означает, что вы не можете повторно использовать эти классы без повторного использования синглтона.
  • Они делают модульное тестирование классов, которые зависят от синглтона, проблематичным, потому что вы не можете легко заменить синглтон на макет.
  • Они поощряют стиль кодирования, когда классы пытаются разрешить свои собственные зависимости.Это плохо, потому что это может уменьшить ясность относительно того, какие зависимости у класса.
  • PHP имеет архитектуру Share Nothing, что означает, что синглтоны PHP на самом деле не являются синглетонами вообще, в каждый момент времени может быть несколько живых экземпляров (по одному на открытый запрос).
  • Что произойдет, если вы вдруг обнаружите, что вам на самом деле нужно больше, чем один ресурс, предоставляемый синглтоном?Это более распространенный сценарий, чем вы могли бы подумать

Вам лучше вместо этого взглянуть на , поскольку оно решает вышеуказанные проблемы.

2 голосов
/ 10 февраля 2012

Я думаю, что синглтон может подойти для менеджера соединений, но не для самого соединения.

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

Менеджер соединений (который может управлять несколькими соединениями) может быть одноэлементным.Само соединение;№.

Ваш менеджер соединений также должен иметь возможность загружать «Драйверы», чтобы иметь возможность создавать подключения MySQL и в тот день, когда вам понадобится msSQL, sqLite или что-либо еще, вы сможетедобавьте необходимые драйверы.

0 голосов
/ 10 февраля 2012

Единственный положительный аргумент, который я слышал о шаблоне проектирования Singleton в PHP, был от разработчика, который реализовал соединение с базой данных Singleton в сочетании с объектом Memcached.На самом деле у меня не было возможности взглянуть на код и производительность, но он смог выдвинуть последовательный аргумент.

Лично я не верю, что шаблон проектирования Singleton очень важен для PHP, чтов любом случае в значительной степени не имеет состояния (как указано перед каждым запросом будет иметь одиночный код).

0 голосов
/ 10 февраля 2012

Этот шаблон будет в порядке, потому что синглтон будет применяться только к текущему сеансу пользователя. Решение действительно сводится к тому, что ваш приоритет. Если вам нужна более высокая производительность для пользователя, то вы хотите разрешить больше соединений с базой данных на пользователя, но если вы хотите ограничить, насколько сильно ваша база данных будет поражена, то синглтон даст вам хорошую середину пути.

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