Какой смысл иметь и включать и требовать конструкции в PHP? - PullRequest
7 голосов
/ 24 ноября 2010

Я пишу приложение PHP впервые (кроме игрушек и упражнений), и я не могу понять, почему PHP включает в себя конструкции include и require.

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

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

public static function include($filename) {
  if (is_readable($filename)) {
    if (!@include($filename)) {
      throw new FileNotFoundException("File deleted after readable check");
    }
  } else {
    throw new FileNotFoundException("File missing or unreadable");
  }
}

Полагаю, я спрашиваю:

  • Какие типы файлов вы действительно хотите опционально включить в приложение?
  • Если вы хотите, чтобы файл был обязательным или необязательным , почему бы вам просто не обработать это в функции, подобной модифицированной версии кода, который я написал выше?

Ответы [ 2 ]

2 голосов
/ 24 ноября 2010

Я бы использовал require для загрузки файлов, необходимых для самого приложения, то есть require 'database_config.php', require 'core.php'. Если это не удастся, вы хотите, чтобы он потерпел неудачу настолько быстро, жестко и беспощадно, насколько это возможно, поскольку что-то явно не так с вашей установкой приложения. В этом состоянии даже не гарантируется, что он мог правильно обработать выброшенное исключение, и require выдает очень четкое сообщение об ошибке без дополнительного кода.

include следует использовать для таких вещей, как файлы шаблонов, которые вы хотите использовать, когда приложение уже запущено и работает и может корректно обрабатывать свои собственные ошибки.


Пример:

include 'error_handler.php';
set_error_handler('error_handler');

/* something bad happens */

Warning: 'error_handler.php' not found!
Error: Specified error handler "error_handler" doesn't exist.

В какой-то момент вы просто полагаетесь на базовые файлы, даже если это всего лишь ваш обработчик ошибок. Вам нужно будет ввести дополнительный код для изящной обработки отсутствующего обработчика ошибок, и даже тогда лучшее, что вы можете сделать, это вывести некоторую ошибку и die (если только вы не хотите войти в игру ловкого обнаружения ошибок, даже если ваш обработчик ошибок не существует) Лучше всего просто require 'error_handler.php'; если хотите, вы можете include и по своему усмотрению обрабатывать все после этого.

0 голосов
/ 24 ноября 2010

Какие файлы вы бы на самом деле хотите дополнительно включить в приложение?

Я обычно использую include со статическими блоками HTML (верхний колонтитул, нижний колонтитул, меню, окно поиска, форму опроса ...) и require с функциями или классами PHP. Маловероятно, что блок нижнего колонтитула исчезнет, ​​но, я полагаю, это хороший визуальный ключ, когда я смотрю на код.

Хотите ли вы, чтобы файл был обязательно или необязательно, почему бы вам просто справиться с этим в функции, как модифицированная версия кода, который я написал выше

Оператор @ считается дорогим, и, во всяком случае, я думаю, что включение внешнего файла - это базовая операция, которая должна охватываться базовым языком. Ваш код также добавляет новую зависимость: если вы храните его в обязательном блоке, ваши дополнительные блоки больше не будут на 100% необязательными; -)

...