Привет всем)) как то обычно работаю с движками и там уже все сделано.. только следуй его философии и все.. а если самому делать какой то сайт на чистом пхп без фреймворка и движка следуя принципам ООП и используя естественно MVC.. где лучше хранить подключение к БД и как лучше делать.. я вижу несколько вариантов 1. Синглтон и в моделях вызывается подключение типа так Db::query('bla-bla-bla').. лично мне не нравится.. хотя вижу многие такой подход используют в своих приложениях.. 2. Реестр - создаем подключение, засовываем в реестр и он там лежит.. создаем какой то абстрактый класс Model с конструктором.. в котором переменной $this->db назначением значение из реестра.. а потом создаем наши модели User extends Model и вроде как уже сразу есть в любой модели подключение к БД... как еще можно и как правильнее что ли?)) Спасибо))
PHP: public $base = [ /* ... */ 'db' => [ Aero\Supports\Lerma::class ], ]; PHP: protected function createBaseApp() { /* ... */ $this -> instance( 'db', $this -> base['db'] ); /* ... */ } PHP: Aero::$app -> db::query( [ 'SELECT id, username, status, password FROM %s WHERE id = %d', $this -> form -> table, $_SESSION['id'] ] ) -> fetch( Aero::$app -> db::FETCH_OBJ ); --- Добавлено --- PHP: public function __get( $name ) { if ( isset ( $this -> instances[$name] ) ) { return $this -> instances[$name]; } throw new Exception( 'Not found component ' . $name ); }
См. в сторону ServiceLocator-а и DI-контейнера. @MouseZver как раз предлагает ServiceLocator. --- Добавлено --- http://php-di.org/ - вот прикольный DI-контейнер
>> Где хранить подключение к базе? Во-первых, - в коде. А во-вторых, если то всё равно, MVC не MVC, синглы не синглы, локаторы не локаторы и т.д. Есть объект, например DB, и все остальные объекты его используют тем или иным способом и их не колышит, где DB хранит подключение к БД. А для DB есть два способа хранения: - где-то глобально (тут самый простой - статика). Используется, если нужно единое подключение на всё время работы скрипта. - локально (тут правильный - в свойствах объекта). Используется, если нужно временное подключение на время жизни объекта. DB это обычный объект, никакой статики, за исключением пары значений для первого случая. Как правило DB создаётся в конструкторе класса-наследника и далее используется подобно $this->db. Как-то так...
@Алекс8 привет, нет, синглон совсем по другим корням идет --- Добавлено --- Не совсем так. В моем примере было описано интерфейс использования некой библиотеки для работы базы данных... а библиотек дохренища. Могу использовать обычную обвертку PDO, могу говнокод safemysql.class.php подключить, или свою реализацию Lerma. Но интерфейс будет единым. И кстати у меня она в статике.
1) Интерфейс к понятию объект/класс не относится. Это просто описание требуемой структуры объекта (методов, например). 2) Если принять, что полностью статический объект есть эквивалент глобальному объекту, по тоже самое - объект. Другое дело, что с глобальным объектом будут проблемы, рано или поздно.
хорошо, буду называть это рычагом для юзабельности некого монстра с другого астрала --- Добавлено --- Мне не известна проблема, просвети неуча
Почему бы не сократить это определение как-нибудь? Слово "интерфейс" отлично подходит, как мне кажется!
@Fell-x27 дело в том что все мы разные, и каждому угодить, как "это" лаконично озвучить.. легче с утра жизнью покончить перебегая зёбру и не заметив тупого водилу в автобусе ( сегодня реал )
По этому и придумана единая терминология была. Чтобы у каждый вещи было конкретное название, понятное любому специалисту на любом языке.