PHP - уровень абстракции DB использует статический класс по сравнению с одноэлементным объектом?

Я не хочу создавать дискуссию об одиночном элементе лучше, чем статичный или лучше, чем глобальный и т.д. Я считал десятки вопросов о подобных предметах на Так, но я не мог придумать ответ на этот Конкретный вопрос, таким образом, я надеюсь, что кто-то мог теперь осветить меня путем ответа на этот вопрос с одним (или больше) реальные простые ПРИМЕРЫ и не только теоретические обсуждения.

В моем приложении у меня есть типичный класс DB, чтобы абстрагировать уровень DB и выполнить задачи на DB, не имея необходимость писать везде в коде mysql_connect / mysql_select_db / mysql...

Я мог записать классу любого как СТАТИЧЕСКИЙ КЛАСС:

class DB
{
   private static $connection = FALSE; //connection to be opened

   //DB connection values
   private static $server = NULL; private static $usr = NULL; private static $psw = NULL; private static $name = NULL;

   public static function init($db_server, $db_usr, $db_psw, $db_name)
   {
      //simply stores connections values, without opening connection
   }

   public static function query($query_string)
   {
      //performs query over alerady opened connection, if not open, it opens connection 1st
   }

   ...
}

ИЛИ как SINGLETON:

class DBSingleton
{
   private $inst = NULL;
   private $connection = FALSE; //connection to be opened

   //DB connection values
   private $server = NULL; private $usr = NULL; private $psw = NULL; private $name = NULL;

   public static function getInstance($db_server, $db_usr, $db_psw, $db_name)
   {
      //simply stores connections values, without opening connection

      if($inst === NULL)
         $this->inst = new DBSingleton();
      return $this->inst;
   }
   private __construct()...

   public function query($query_string)
   {
      //performs query over already opened connection, if connection is not open, it opens connection 1st
   }

   ...
}

Затем после в моем приложении, если я хочу запросить DB, я мог бы сделать

//Performing query using static DB object
DB:init(HOST, USR, PSW, DB_NAME);
DB::query("SELECT...");

//Performing query using DB singleton
$temp = DBSingleton::getInstance(HOST, USR, PSW, DB_NAME);
$temp->query("SELECT...");

Мне Singleton имеет единственное преимущество, чтобы не объявлять как static каждый метод класса. Я уверен, что некоторые из Вас могли дать мне ПРИМЕР реального преимущества одиночного элемента в этом конкретном случае.Заранее спасибо.

24
задан Marco Demaio 30 October 2012 в 12:24
поделиться

1 ответ

В своем последнем проекте я фактически пошел против "хороших" принципов проектирования, сделав класс базы данных полностью статическим. Причина этого в том, что я использовал много кэширования для объектов PHP. Первоначально я передавал базу данных через конструктор каждого объекта в качестве инъекции зависимости, однако я хотел убедиться, что база данных не должна подключаться, если это не является абсолютно необходимым. Таким образом, использование базы данных в качестве переменной-члена объекта было бы нецелесообразным, потому что если бы вы выгружали объект из кэша, вы бы не захотели подключаться к базе данных, пока не выполните над ним какую-либо операцию.

Поэтому в итоге у меня было только две (публичные) статические функции, Database::fetch() и Database::execute(), которые проверяли, было ли уже подключение, и если нет, то подключались и выполняли запрос. Таким образом, мне не придется беспокоиться о десериализации, и я буду подключаться как можно реже. Однако технически это делает невозможным модульное тестирование.

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

4
ответ дан 29 November 2019 в 00:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: