Я загружаю фреймворк и код, и у меня есть вопрос относительно require
и include
vs class_exists
.
В коде, который я загружаю, я вижу:
require_once('class.php');
Так же как:
if(class_exists('class') == false) { require('class.php'); }
Я получаю require_once
означает только 1 раз, и класс существует, проверьте, существует ли класс.
Мой вопрос: второй лучше, чем первый? и почему?
это условие:
if(class_exists('class') == false) { require('class.php'); }
запретить вызов require_once
.
require_once
может быть медленным, если у вас есть много файлов, которые вы включаете в свой проект (специально для фреймворков), потому что они должны сканировать код, чтобы убедиться, что файл не включен дважды и более. поэтому, если у вас есть более 25 файлов, которые вы включаете, и они вложены, require_once должен будет проверить все.
Как обсуждалось в других ответах, существуют семантические различия между этими двумя вариантами. Также в сценарии совместного хостинга, где хостинг-провайдер не предлагает кэширование PHP-кода ( APC или equiv), все файлы кода должны быть прочитаны и скомпилированы один раз за запрос . Здесь главный убийца – это не время компиляции (~ 0.5M PHP-инструкции / сек на современном ядре), но накладные расходы ввода-вывода для сбора файлов PHP, если они не кэшированы в кеш файловой системы (10 с I / Os / sec).
В этом случае, если для приложения требуется ядро из десятка модулей для 90% запросов, тогда имеет смысл кэшировать их в один файл с объемной загрузкой. Если этот тип решения принят, то размещение class_exists('class')
вокруг требования файла класса делает его защищенным от бомбы.
Также предостережение: если вы используете функцию __autoload()
для загрузки класса JiT, имейте в class_exists('fred')
что class_exists('fred')
вызовет автозагрузку fred
. Если вам нужен слабый зонд, вам нужно использовать предикат !in_array( 'fred', get_declared_classes() )
.
Второй из них обеспечит большую защиту от импорта класса дважды. Первый импортирует файл класса один раз, но если класс был импортирован из другого файла, по какой-то причине второй получит, что класс уже был объявлен ранее и не требует класса.
require_once()
include
только один файл sa.
class_exists()
проверяет, существует ли ваш класс .
Вы можете определить класс в нескольких файлах, а require_once()
не волнует. Второй кусок будет.