[PHP] Экземпляр класса MySQLi в других классах (только с оберткой?)

bigton
На сайте с 17.08.2009
Offline
43
2095

Здравствуйте!


$db = new mysqli('localhost', ...);

if ($db->connect_errno != 0)
{
exit();
}

class A
{
function add()
{
$db->query(...); // ???
}
}

Как корректно использовать экземпляр класса MySQLi в других классах? Поиск советует использовать обертку с созданием статического метода. Кто то предлагает решение типа global в конструкторе другого класса. Как быть?

Спасибо!

TF-Studio
На сайте с 17.08.2010
Offline
334
#1

global $db;

вполне уместно имхо.

Всё ещё лучший способ заработка для белых сайтов: GoGetLinks (https://www.gogetlinks.net/?inv=fahbn8).
ДП
На сайте с 23.11.2009
Offline
203
#2

Есть еще вариант с использованием полей объекта. Передавайте $db в конструктор, приcваивайте приватному полю значение $db, а потом в классах уже используйте $this->db.

C
На сайте с 20.05.2011
Offline
14
#3


<?php
class DB {
protected static $instance = null;
protected static $db = null

public static function &instance() {
if (is_null(self::$instance)) {
self::$instance = new DB();
}

return self::$instance;
}

protected function __construct() {
#host и т.д. читаем из общего конфига
self::$db = new mysqli('localhost', ...); # лучще PDO
# set names etc...
}

public function __destruct() {
# здесь можно как-то особенно закрыть и т.д.
}

public function __call($method, $params) {
return call_user_func_array(array(self::$db, $method), $params);
}

public static function __callStatic($method, $params) {
return call_user_func_array(array(self::$db, $method), $params);
}
}

...
#где-то:
require_ince 'db.php' # или используем autoloading

DB::istance()->query(...)

или, если экземпляр уже где-то ранее создан, просто как:
DB::query(...)

?>
bigton
На сайте с 17.08.2009
Offline
43
#4

Резюмируя, получается 3 возможных варианта:


$db = new mysqli(...);

// 1
class A
{
var $db = null;

function __construct()
{
global $db;

$this->db = $db;
}

function b()
{
$this->db->query(...);
}
}

// 2
class A
{
var $db = null;

function __construct($db)
{
$this->db = $db;
}

function b()
{
$this->db->query(...);
}
}

$class_a = new A($db);

// 3

// Обертка (предложил cryptex)

Минусы:

1й вариант - нарушает принципы ооп

2й вариант - не очень "смотрится", если в конструктор необходимо передать несколько экземпляров разных классов

3й вариант - не хочется делать "обертку" по причине создания еще одного класса суть которого только передать экземпляр.

Если других вариантов нет, получается наиболее правильный 3й...

n0name
На сайте с 22.12.2006
Offline
54
#5
bigton:

Минусы:
1й вариант - нарушает принципы ооп
2й вариант - не очень "смотрится", если в конструктор необходимо передать несколько экземпляров разных классов
3й вариант - не хочется делать "обертку" по причине создания еще одного класса суть которого только передать экземпляр.

Если других вариантов нет, получается наиболее правильный 3й...

Исходите из того, насколько большой проект у вас. Если средний, то смело используйте 3-й вариант. В большинстве фреймворков он тоже применяется.

Если проект большой или нужно работать с несколькими БД, то лучше 2-й вариант (вкупе с 3-м).

Сервис сравнения цена на VPS (http://vpska.com/)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий