file_exists() или is_readable()

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

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

or

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

?


person Co za asy...    schedule 07.07.2011    source источник


Ответы (4)


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. И только реж: используйте is_dir() и is_readable()
  3. И это файл или каталог: используйте is_readable()

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


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

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

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

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

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

person James    schedule 05.06.2015
comment
Отличный и лучший ответ на данный момент! +1 - person WΩLLE - ˈvɔlə; 18.08.2015
comment
Используйте is_file() проверку отсутствующего изображения статьи, чтобы избежать ненужных предупреждений и ошибок. - person ; 07.11.2019

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

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

person Brian Graham    schedule 07.07.2011
comment
но что, если вы не уверены, что файл существует? - person Co za asy...; 07.07.2011
comment
require используется, чтобы убедиться, что файл существует, прежде чем продолжить. Если этот файл требуется, будет выдано сообщение об ошибке, если файла нет. Если файл не имеет решающего значения для вашей страницы, используйте include. - person Brian Graham; 07.07.2011

Ответ: is_readable().

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

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

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

person Dan Spiteri    schedule 07.07.2011
comment
Да, но далее ниже написано: Возвращает TRUE, если файл или каталог, указанный в имени файла, существует и доступен для чтения, в противном случае — FALSE. - person nevvermind; 02.04.2015
comment
Это правильный ответ. Рекомендуется применять && is_file($filename) для дополнительной прозрачности папок, поскольку они также возвращают значение true. - person tfont; 18.11.2015

if (is_file($file) && is_readable($file))

потому что is_readable($file) может быть true также для каталогов.

person pulsit    schedule 08.04.2015