Когда для запуска соединения MySQLi (2 сценария)

64
10

Я делаю свой первый проект PHP с помощью mysqli (я использовал mysql до сегодняшнего дня). Поскольку это довольно просто, я не использую классы, просто функции, и мне интересно, когда и как мне создать экземпляр соединения. Т.е., я думаю об этих двух сценариях:

Сценарий I:

$DBLink = new mysqli(...);

function foo($DBLink, $params, ...) {
//Stuff.
}

foo($DBLink, ...);

Сценарий II:

function getConnection() {
$DBLink = new mysqli(...);
return $DBLink;
}

function foo($params,...) {
$DBLink = getConnection();
//Stuff
}

foo(...);

Будет работать более одной функции с помощью DBLink (довольно много, на самом деле).

Какой из двух сценариев лучше и почему? Я предпочитаю второй, он кажется более чистым, но, возможно, это лучшая идея, создающая его экземпляр только один раз.

спросил(а) 2021-01-25T14:05:29+03:00 5 месяцев назад
1
Решение
63

Ответ - второй метод, хотя есть лучший способ сделать это.

Лучший вариант - использовать одноэлементный класс, который вы можете получить из любого метода, который вы хотите. Неполный пример был бы (это не будет работать само по себе, но это дает вам представление о том, что происходит внутри одноэлементного типа);

class Database {
private static $conn = NULL;

public function __construct(...) {
self::$conn = new mysqli(...);
}

public static function getInstance() {
return self::$conn;
}
}

который вы можете использовать для получения текущего соединения;

// initailise connection
$conn = new Database(...);

function foo() {
$db = Database::getInstance();
// do stuff
}

Вы можете получить полные классы-оболочки для вашего соединения MySQLi, например, этот PHP-MySQLi-Database-Class, который также имеет вспомогательные методы для ваших запросов. Это означает, что вам не нужно беспокоиться о том, чтобы поддерживать класс оболочки.

ответил(а) 2021-01-25T14:05:29+03:00 5 месяцев назад
46

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

Пример ниже показывает использование класса, но не то, что вы просите, но, вероятно, вы должны принять во внимание.

singleton.php


<?php
class Database
{
// Store the single instance of Database
private static $m_pInstance;

private $db_host='localhost';
private $db_user = 'root';
private $db_pass = '';
private $db_name = 'databasename';

// Private constructor to limit object instantiation to within the class
private function __construct()
{
mysql_connect($this->db_host,$this->db_user,$this->db_pass);
mysql_select_db($this->db_name);
}

// Getter method for creating/returning the single instance of this class
public static function getInstance()
{
if (!self::$m_pInstance)
{
self::$m_pInstance = new Database();
}
return self::$m_pInstance;
}

public function query($query)
{
return mysql_query($query);
}

}
?>

& мы можем назвать это из других файлов или функций:

<?php
include 'singleton.php';
$pDatabase = Database::getInstance();

$result = $pDatabase->query('...');
?>

ответил(а) 2021-01-25T14:05:29+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема