file_exists () или is_readable () - PullRequest
27 голосов
/ 07 июля 2011

Какой из них следует использовать, если вы хотите включить файл PHP?

if(file_exists($file) require "$file";

или

if(is_readable($file) require "$file";

?

Ответы [ 4 ]

26 голосов
/ 05 июня 2015

file_exists() или is_readable()
Какой из них следует использовать, если вы хотите включить файл PHP?

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

Иногда вам важно только, чтобы файл и / или каталог существовали, и вам не нужно читать, иногда вам также нужно прочитать.

Опции

file_exists ()

Проверяет, существует ли файл или каталог .

Если вы явно хотите знать, существует ли файл , это вернет ложные срабатывания, а также вернет true, если это каталог.

is_readable ()

Сообщает, существует ли файл или каталог и доступен ли он для чтения.

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


Дополнительные опции, которые вы не упомянули, но, вероятно, нуждаетесь:

is_file ()

Сообщает, существует ли он и является ли он обычным файлом (не каталогом).

is_dir ()

Сообщает, существует ли он и является каталогом (не файлом).

Решение и ответ

Если вы хотите проверить, существует и:

  1. Это только файл: используйте is_file()
  2. Это только каталог: используйте is_dir()
  3. Файл или каталог: используйте file_exists()

Если вы хотите проверить, существует и доступен для чтения:

  1. И это только файл: используйте is_file() и is_readable()
  2. And is only dir: Используйте is_dir() и is_readable()
  3. А это файл или каталог: используйте is_readable()

Вам не нужно использовать file_exists() и is_readable() вместе, потому что is_readable() также проверяет, если file_exists().
Сопоставление is_readable() с is_file() или is_dir() предназначено только для проверки, является ли читаемым , в частности, только для файла или , в частности только для каталога.


Опираясь на требование

Как и в большинстве PHP и «какой подход / функция / и т. Д.» - это зависит от сценария.

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

VITAL:
Если файл является классом соединения с базой данных, который позволяет обслуживать весь контент страницы, то для файла, которого там нет, скорее всего, требуется остановка системы.
Конечно, тогда у вас должна быть какая-то стратегия выхода, такая как показ страницы 404, или сообщение об ошибке: «Извините, произошла ошибка, мы рассмотрим ее» и т. Д.

НЕ VITAL:
Иногда допустимо, чтобы файл не существовал или, по крайней мере, не наносил ущерба остальной части приложения.
Например, если файл изображения не существует, вы можете отправить сообщение или изображение по умолчанию, например, аватар пользователя будет просто иметь аватар по умолчанию, если их аватар не найден.

9 голосов
/ 07 июля 2011

Ответ: is_readable () .

bool is_readable (строка $ filename)

Указывает, существует ли файл и доступен ли для чтения.

http://us3.php.net/manual/en/function.is-readable.php

6 голосов
/ 07 июля 2011

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

Если вам все равно, существует ли файл, просто используйте include.

4 голосов
/ 08 апреля 2015
if(is_file($file) && is_readable($file))

потому что is_readable также верно для каталогов

...