Это означает, что вызов к виртуальной функции будет переведен к "правильному" классу.
C++ FAQ, Облегченный FTW.
Короче говоря, это часто используется в сценариях множественного наследования, где "ромбовидная" иерархия формируется. Виртуальное наследование тогда повредит неоднозначность, созданную в нижнем классе, когда Вы вызовете функцию в том классе, и функция должна быть разрешена к любому классу D1 или D2 выше того нижнего класса. Посмотрите объект FAQ для схемы и деталей.
Это также используется в родственная делегация , мощная функция (хотя не для слабонервных). См. этот FAQ.
Также посмотрите Объект 40 в Эффективном C++ 3-й выпуск (43 в 2-м выпуске).
Когда лучше использовать "extends" чем передать классу $ db, предполагая, что каждый класс использует db?
Когда это имеет смысл - и только когда это так!
У вас есть как минимум две вещи, которые следует учитывать:
класс A расширяет B
» вид означает " класс A ** - это ** B
"
Автомобиль
- это MotorVehicu
; Моторное транспортное средство
является Транспортным средством
; Автобус
- это Моторное транспортное средство
; Велосипед - это Транспортное средство
Мяч
не является Транспортным средством
определенно не является База данных
! И не Login
расширять
один класс
Транспортное средство
и Животное
Автомобиль
- это Моторное транспортное средство
, которое само по себе, - это Автомобиль
: -) В случае объекта базы данных (в вашем случае это больше соединение с БД) , большинство ваших классов будут не сами «быть» подключенными к базе данных. Таким образом, они не должны расширять этот класс.
Однако они используют соединение с БД ( Форма
" имеет " соединение с БД) ; поэтому у них должно быть свойство, представляющее это соединение с БД. Это то, что вы делаете.
Вместо передачи $ db
каждому конструктору,
Думаю, это можно рассматривать как шаблон проектирования Dependancy Injection, кстати (не уверен, но похоже)
По поводу загрузки большого количества классов другие люди дали ответы:
Оба эти предложения - отличные предложения, которые вы должны принять во внимание ; -)
И последнее:
Передается ли $ db к каждому классу больно каким-либо образом с точки зрения производительности?
Может быть, это маленький бит; но, честно говоря, за исключением случаев, когда вы пользуетесь Google и у вас миллионы пользователей ... кого это волнует?
Если вы выполняете пару запросов к БД, это займет МНОГО времени по сравнению с передачей еще одного параметра даже дюжине методы!
Таким образом, небольшим количеством времени, которое используется для передачи параметров, вероятно, можно пренебречь : -)
Почему бы не включить только те файлы, которые необходимо включить? Кроме того, попробуйте создать экземпляры только тех объектов, которые вам нужны, там, где они вам нужны. Как бы то ни было, ваш includes.php
выполняет множество экземпляров, которые вам могут не понадобиться постоянно.
Если $ db
передается в качестве ссылки, это не должно быть ' t влияют на производительность. (Я мало что знаю о PHP5, но в PHP4 была концепция ссылки с модификатором « &
».)
Я не уверен, как именно вы хотите использовать здесь наследование (' extends
'). Вы можете использовать его для определения двух полей $ db
и $ config
, но в противном случае это не сильно изменится.
Кроме того, это может ограничить вас, когда вы действительно хотите наследовать что-то полезное от другого класса.
В зависимости от вашего дизайна, вы можете подумать о том, чтобы сделать $ config
глобальным. Бывает ли ситуация, когда одновременно активна более 1 конфигурации? Однако, вероятно, не стоит вводить глобальную переменную $ db
. Вполне возможно, что вам может потребоваться, например, более одного подключения к базе данных одновременно.
Вы пробовали что-то подобное?
function __autoload($class_name) {
require_once("includes/php/class." . $class_name . ".php");
}
Таким образом, имя класса загружается только тогда, когда имя класса встречается. (Измените путь в соответствии с вашими php-классами ... мой похож на class.Object.php с именем класса "Object").
Если загрузка и анализ файлов сценариев становится узким местом, вы можете использовать кэш байт-кода, например apc , чтобы ускорить эту часть жизненного цикла.