Понимание требуемого класса и наличие

Я загружаю фреймворк и код, и у меня есть вопрос относительно require и include vs class_exists.

В загружаемом коде я вижу:

require_once('class.php');

Также как:

if(class_exists('class') == false) {  require('class.php'); }

Я получаю require_once означает только 1 раз, и существует класс, проверяющий, существует ли класс.

Мой вопрос: второй лучше первого? и почему?

Ответ 1

это условие:

if(class_exists('class') == false) {  require('class.php'); }

предотвратить вызов require_once.

require_once может быть медленным, если у вас много файлов, которые вы добавляете в свой проект (специально для фреймворков), потому что они должны сканировать код, чтобы убедиться, что файл не включен дважды и более. поэтому, если у вас есть более 25 файлов, которые вы включаете, и они вложены, require_once должен будет проверить все из них.

Ответ 2

Как обсуждалось в других ответах, существуют семантические различия между этими двумя вариантами. Также в сценарии совместного хостинга, где хостинг-провайдер не предлагает кэширование PHP-кода ( APC или equiv), все файлы кода должны быть прочитаны и скомпилированы один раз за запрос. Здесь главный убийца - это не время компиляции (~ 0.5M PHP-инструкции/сек на современном ядре), но накладные расходы ввода-вывода для сбора файлов PHP, если они не кэшированы в кеш файловой системы (10 с I/Os/sec).

В этом сценарии, если для приложения требуется ядро ​​из дюжины модулей для 90% запросов, тогда имеет смысл кэшировать их в один файл большой загрузки. Если этот тип решения принят, то размещение защиты class_exists('class') вокруг требования файла класса делает его защищенным от бомбы.

Также предостережение: если вы используете функцию __autoload() для загрузки класса JiT, имейте в виду, что class_exists('fred') вызывает автозагрузку fred. Если вам нужен слабый зонд, вам нужно вместо этого использовать предикат !in_array( 'fred', get_declared_classes() ).

Ответ 3

Второй способ обеспечит большую защиту от импорта класса дважды. Первый импортирует файл класса один раз, но если класс был импортирован из другого файла, по какой-то причине второй получит, что класс уже был объявлен ранее и не требует файла класса.

Ответ 4

  • require_once() только include файл один раз.

  • class_exists() проверяет, существует ли ваш класс.

Вы можете определить класс в нескольких файлах, а require_once() все равно. Ваш второй кусок будет.