Mysql
 sql >> база данни >  >> RDS >> Mysql

Модел на клас MySQLi за връзка, затваряне, оставяне отворено?

Бих го сметнал за недобра практика. Това е особено поради една причина:проблемът, който описвате, защо смятате, че имате нужда от него:Само една връзка на заявка.

Не е необходимо да кодирате нищо. mysqli има хубава вградена функция, връзката по подразбиране. Той избира параметрите за връзка с базата данни от настройките на ini (конфигурация) всеки път, когато създавате нов екземпляр:

$db = new mysqli;

Тъй като всички връзки към базата данни се затварят, когато скриптът приключи, изобщо няма какво да ви интересува. Единственото нещо, което трябва да направите, е да установите връзката веднъж и да предадете променливата на целия код, който се нуждае от този mysqli обект.

Друга лоша практика е, че въвеждате Singleton тук, нещо като:

class MysqliSingleton extends mysqli
{
    private static $instance;
    /**
     * @return MysqliSingleton
     */
    public function getInstance()
    {
        if (NULL === self::$instance)
            self::$instance = new self();
        return self::$instance;
    }
    private function __construct()
    {
    }
    public function __clone()
    {
         throw new RuntimeException('Clone is not allowed.');
    }
    public function __wakeup()
    {
        throw new RuntimeException('Unserializing is not allowed.');
    }
}

Ще работи по следния начин:

$mysqli = MysqliSingleton::getInstance();

и винаги ще връща този един екземпляр на mysqli, който може да е това, което търсите. Въпреки това Singletons се считат за вредни, тъй като могат да създадат много проблеми, вижте свързания въпрос Кой има нужда от сингълтони? .

По-лесно е да създадете сами променлива, която предавате, съдържаща екземпляра на базата данни. Можете допълнително да капсулирате някакъв вид отложено зареждане, в случай че вашето приложение не винаги се нуждае от mysqli връзка, напр. с много прост контекстен клас:

interface ContextMysqli
{
    /**
     * @return mysqli
     */
    public function getMysqli();
}

class Context implements ContextMysqli
{
    private $mysqli;
    public function getMysqli()
    {
        $this->mysqli || $this->mysqli = new mysqli();
        return $this->mysqli;
    }
}

Когато вашите скриптове стартират, просто създайте своя контекст и го предайте на всяка част от вашия код, където имате нужда от него:

$context = new Context();
...
$result = do_some_db_work($context);
...
function do_some_db_work(ContextMysqli $context)
{
    $mysqli = $context->getMysqli();
    ...
}

Това предложение също може да е малко късогледо, но е по-добро от единичен, като същевременно не въвежда много шум. Предимството е, че сте капсулирали логиката кога да създадете mysqli обект без нуждата от сингълтън. Вашият код вече е независим от глобален или статичен контекст.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използвайте стойността на колоната на таблицата за LIMIT, когато извършвате свързване

  2. Основите на настройката на MySQL на специализирани сървъри

  3. Обработване на застой в innoDB

  4. Правилен начин за преминаване между 5 000 до 100 000 стойности в mysql WHERE клауза

  5. MySQL ORDER BY поле за дата, което не е във формат на дата