Когда я должен использовать «расширяет», а
чем передать $ db классу,
при условии, что каждый класс использует БД?
Когда это имеет смысл - и только тогда, когда это имеет смысл!
У вас есть по крайней мере две вещи для рассмотрения:
- "
class A extends B
" Вид средств "class A **is a** B
"
- более четко,
Car
- это MotorVehicule
; MotorVehicule
представляет собой Vehicule
; Bus
- это MotorVehicule
; Велосипед это Vehicule
- однако
Ball
не является Vehicule
- В вашем случае
Form
определенно не DataBase
! Также не является Login
- В PHP класс может только
extend
один класс
- Вы не можете иметь что-то одновременно
Vehicule
и Animal
- Но
Car
- это MotorVehicule
, что само по себе является Vehicule
: -)
В случае объекта базы данных (в вашем случае это скорее соединение с БД) , большинство ваших классов сами не будут "подключаться к базе данных". Поэтому они не должны расширять этот класс.
Однако они используют соединение с БД (Form
" имеет соединение с БД ") ; поэтому они должны иметь свойство, представляющее это соединение с БД. Это то, что вы делаете.
Вместо передачи $db
каждому конструктору, вы можете использовать
- либо Singleton шаблон проектирования
- или шаблон проектирования реестра
- или какая-то глобальная переменная, но это почти то же самое ... просто хуже (не ООП и все такое) !
Но передача объекта $db
отлично подходит для модульного тестирования, макетов объектов и всего такого ...
Я думаю, это можно рассматривать как шаблон проектирования Dependancy Injection, кстати (не уверен, но выглядит так)
О загрузке большого количества классов, другие люди дали ответы:
- Используйте автозагрузку, если можете
- Используйте кэш кода операции, например APC, если можете
Оба эти отличных предложения, которые вам следует принять во внимание ; -)
И последнее:
Действительно ли передача $ db каждому классу больно
каким-либо образом с точки зрения производительности?
Может быть, это маленький бит; но, честно говоря, если только вы не гуглили и у вас миллионы пользователей ... кого это волнует?
Если вы выполняете несколько запросов к БД, на это потребуется МНОГО времени, по сравнению с передачей еще одного параметра даже дюжине методов!
Итак, небольшим количеством времени, используемым для прохождения параметров, можно пренебречь : -)