Использование php, realpath и realpath + file_exists - PullRequest
4 голосов
/ 04 декабря 2011

по соображениям производительности мы должны использовать только realpath () вместо realpath () + file_exists () при проверке существования файла или каталога ??

CASE A ::

if(realpath(__DIR__."/../file.php")===false)

CASE B ::

if(file_exists(realpath(__DIR__."/../file.php"))===false)

Я думаю CASE A выполняет работу, а CASE B выполняет работу два раза.

Ответы [ 3 ]

7 голосов
/ 04 декабря 2011

Мало того, что регистр B избыточен (поскольку realpath возвращает false, если путь не может быть разрешен или файл не существует согласно документам ), если файл не существует, это немного глупо .

Так как это утверждение вернет FALSE:

realpath(__DIR__."/../file.php");

Это:

file_exists(realpath(__DIR__."/../file.php"));

Это действительно так:

file_exists(FALSE); //!

<ч /> В качестве примечания: realpath никогда не вернет значение «ЛОЖЬ». Под этим я подразумеваю, что он никогда не вернет то, что == FALSE, но не === FALSE (например, NULL, '', 0, array ()). Зачем? Ну, реальный путь всегда будет включать ссылку на корень & mdash; / в * nix системах (Mac, Unix, Linux) и C:\ в Windows, и эти две строки будут иметь значение true при использовании в качестве логического значения (скажем, в цикле if, while или for). Это означает, что вы можете просто сделать:

if(!realpath(__DIR__."/../file.php")) // do something

Или, если вам действительно нужно иметь реального пути, вы можете:

if(!($path = realpath(__DIR__."/../file.php")))
   // file does not exist
else
   // $path is now the full path to the file
2 голосов
/ 04 декабря 2011

Это правильно.realpath () вернет false, если файл не существует.Случай B является избыточным.

http://us3.php.net/realpath#refsect1-function.realpath-returnvalues

1 голос
/ 13 марта 2013

Они почти одинаковы, но не совсем!

Случай A проверит, существует ли путь, realpath вернет не ложные значения, если путь после его расширения будет указывать на файл или папка .Также, если вы передадите realpath a null -значение или пустую строку, он вернет текущую папку.

Случай B также может проверить, является ли возвращаемый путь обычным файлом (в отличие от каталога!).Если realpath разрешает путь к папке, вызов is_file вернет false, и вы сможете обработать его оттуда.

Так что realpath проверит, существует ли файл или папка (или ссылка на символическую ссылку)туда) по указанному пути и развернет пустые значения в текущем каталоге.Дополнительная проверка is_file может гарантировать, что вы работаете с файлом, а не папкой.

Используйте вариант B (с is_file вместо file_exists), если вы хотите быть уверены, что работаете сфайл, используйте вариант A, если с папками тоже все в порядке.:)

file_exists (в отличие от is_file) возвращает true и для каталогов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...