выполнение загрузки php классы и использование 'расширяется'

Это означает, что вызов к виртуальной функции будет переведен к "правильному" классу.

C++ FAQ, Облегченный FTW.

Короче говоря, это часто используется в сценариях множественного наследования, где "ромбовидная" иерархия формируется. Виртуальное наследование тогда повредит неоднозначность, созданную в нижнем классе, когда Вы вызовете функцию в том классе, и функция должна быть разрешена к любому классу D1 или D2 выше того нижнего класса. Посмотрите объект FAQ для схемы и деталей.

Это также используется в родственная делегация , мощная функция (хотя не для слабонервных). См. этот FAQ.

Также посмотрите Объект 40 в Эффективном C++ 3-й выпуск (43 в 2-м выпуске).

5
задан Charles 25 December 2012 в 00:29
поделиться

5 ответов

Когда лучше использовать "extends" чем передать классу $ db, предполагая, что каждый класс использует db?

Когда это имеет смысл - и только когда это так!

У вас есть как минимум две вещи, которые следует учитывать:

  • « класс A расширяет B » вид означает " класс A ** - это ** B "
    • более ясно, Автомобиль - это MotorVehicu ; Моторное транспортное средство является Транспортным средством ; Автобус - это Моторное транспортное средство ; Велосипед - это Транспортное средство
    • , однако Мяч не является Транспортным средством
    • В вашем случае форма определенно не является База данных ! И не Login
  • В PHP класс может только расширять один класс
    • Вы не можете иметь что-то одновременно Транспортное средство и Животное
    • Но Автомобиль - это Моторное транспортное средство , которое само по себе, - это Автомобиль : -)

В случае объекта базы данных (в вашем случае это больше соединение с БД) , большинство ваших классов будут не сами «быть» подключенными к базе данных. Таким образом, они не должны расширять этот класс.

Однако они используют соединение с БД ( Форма " имеет " соединение с БД) ; поэтому у них должно быть свойство, представляющее это соединение с БД. Это то, что вы делаете.


Вместо передачи $ db каждому конструктору,
Думаю, это можно рассматривать как шаблон проектирования Dependancy Injection, кстати (не уверен, но похоже)


По поводу загрузки большого количества классов другие люди дали ответы:

  • Использовать автозагрузку, если вы можете
  • использовать кеш-код операций, например APC, если можете

Оба эти предложения - отличные предложения, которые вы должны принять во внимание ; -)


И последнее:

Передается ли $ db к каждому классу больно каким-либо образом с точки зрения производительности?

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

Если вы выполняете пару запросов к БД, это займет МНОГО времени по сравнению с передачей еще одного параметра даже дюжине методы!
Таким образом, небольшим количеством времени, которое используется для передачи параметров, вероятно, можно пренебречь : -)

7
ответ дан 18 December 2019 в 13:17
поделиться

Почему бы не включить только те файлы, которые необходимо включить? Кроме того, попробуйте создать экземпляры только тех объектов, которые вам нужны, там, где они вам нужны. Как бы то ни было, ваш includes.php выполняет множество экземпляров, которые вам могут не понадобиться постоянно.

Если $ db передается в качестве ссылки, это не должно быть ' t влияют на производительность. (Я мало что знаю о PHP5, но в PHP4 была концепция ссылки с модификатором « & ».)

1
ответ дан 18 December 2019 в 13:17
поделиться

Я не уверен, как именно вы хотите использовать здесь наследование (' extends '). Вы можете использовать его для определения двух полей $ db и $ config , но в противном случае это не сильно изменится.

Кроме того, это может ограничить вас, когда вы действительно хотите наследовать что-то полезное от другого класса.

В зависимости от вашего дизайна, вы можете подумать о том, чтобы сделать $ config глобальным. Бывает ли ситуация, когда одновременно активна более 1 конфигурации? Однако, вероятно, не стоит вводить глобальную переменную $ db . Вполне возможно, что вам может потребоваться, например, более одного подключения к базе данных одновременно.

1
ответ дан 18 December 2019 в 13:17
поделиться

Вы пробовали что-то подобное?

function __autoload($class_name) {
 require_once("includes/php/class." . $class_name . ".php");
 }

Таким образом, имя класса загружается только тогда, когда имя класса встречается. (Измените путь в соответствии с вашими php-классами ... мой похож на class.Object.php с именем класса "Object").

4
ответ дан 18 December 2019 в 13:17
поделиться

Если загрузка и анализ файлов сценариев становится узким местом, вы можете использовать кэш байт-кода, например apc , чтобы ускорить эту часть жизненного цикла.

1
ответ дан 18 December 2019 в 13:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: