Php, используя один класс в другом классе - PullRequest
0 голосов
/ 24 ноября 2010

У меня есть вопрос об использовании моего класса базы данных в других классах на моем сайте.Мне нужен только один объект из моего класса базы данных, и это тот экземпляр, на котором я хочу выполнить все свои запросы.

У меня есть класс MysqliExtension, который расширяет и добавляет некоторые дополнительные функции в класс mysqli.У меня также есть класс Users, который управляет входами / выходами моих пользователей, извлекает их информацию из базы данных и т. Д. Наконец, у меня есть файл config.php, в который я включаю эти два класса и создаю экземпляры объектов классов MysqliExtension и User.

config.php

require_once 'MysqliExtension.php';
require_once 'Users.php';

$database = new MysqliExtension(host,....);

Я хотел бы получить некоторые мнения о наилучшем способе передачи моего объекта базы данных в мой объект User.

Опция 1

В моем файле config.php

$user = new User($username,password);

в моем файле Users.php

    class User{


function myfunction(){

global $database;
$database->callDatabaseFunction();
return $some_result;
}

}

}

Вариант 2

В моем файле config.php

$user = new User($username,password,$database);

в моем файле Users.php

class User{

function __construct($username,$password,$database){    
$this->database = $database;
    }

function myfunction(){

$this->database->callDatabaseFunction();
return $some_result;
}

}

}

Какой путьлучше, или они почти одинаковые?Есть ли другой способ все вместе, о котором я не думал?

Ответы [ 2 ]

2 голосов
/ 24 ноября 2010

Если вам нужен только один экземпляр класса: http://en.wikipedia.org/wiki/Singleton_pattern

Примеры использования (используя пример PHP в ссылочной ссылке):

$instance = Singleton::getInstance();

// or

Singleton::getInstance()->somefunction();

Обратите внимание, что этот метод допускает только один экземпляр объекта, поэтому, если вам нужно использовать более одного (скажем, иметь 2 подключения к различным базам данных), предпочтительно не использовать его.

1 голос
/ 24 ноября 2010

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

$user_results = database::callDatabaseFunction()

без создания экземпляра объекта.

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