Подтвердить что ты не робот

Проверьте, существует ли (или требуется)

Как вы проверяете, существует ли include/require_once до его вызова, я попытался поместить его в блок ошибок, но PHP это не понравилось.

Я думаю, что file_exists() будет работать с некоторыми усилиями, однако для этого потребуется весь путь к файлу, и относительный include не может быть легко передан в него.

Есть ли другие способы?

4b9b3361

Ответ 1

Я считаю, что file_exists работает с относительными путями, хотя вы также можете попробовать что-то в этом направлении...

if([email protected]("script.php")) throw new Exception("Failed to include 'script.php'");

... Нет необходимости говорить, что вы можете заменить исключение для любого метода обработки ошибок по вашему выбору. Идея здесь состоит в том, что if -statement проверяет, может ли файл быть включен, и любые сообщения об ошибках, которые обычно выводятся с помощью include, подавляются с помощью префикса @.

Ответ 3

Вы также можете проверить любые переменные, функции или классы, определенные в файле include, и посмотреть, работает ли скомпилированный файл.

if (isset($variable)) { /*code*/ }

ИЛИ

if (function_exists('function_name')) { /*code*/ }

ИЛИ

if (class_exists('class_name')) { /*code*/ }

Ответ 4

file_exists будет работать с проверкой, существует ли требуемый файл, если он относится к текущему рабочему каталогу, поскольку он отлично работает с относительными путями. Однако если файл include был в другом месте PATH, вам нужно будет проверить несколько путей.

function include_exists ($fileName){
    if (realpath($fileName) == $fileName) {
        return is_file($fileName);
    }
    if ( is_file($fileName) ){
        return true;
    }

    $paths = explode(PS, get_include_path());
    foreach ($paths as $path) {
        $rp = substr($path, -1) == DS ? $path.$fileName : $path.DS.$fileName;
        if ( is_file($rp) ) {
            return true;
        }
    }
    return false;
}

Ответ 5

file_exists() работает с относительными путями, он также проверяет наличие каталогов. Вместо этого используйте is_file():

if (is_file('./path/to/your/file.php'))
{
    require_once('./path/to/your/file.php');
}

Ответ 6

Я думаю, что правильный путь:

if(file_exists(stream_resolve_include_path($filepath))){
  include $filepath;    
}

Это связано с тем, что в документации говорится, что stream_resolve_include_path разрешает "имя файла" по пути include в соответствии с теми же правилами, что и fopen()/включить. "

Некоторые люди предложили использовать is_file или is_readable, но , что не для общего использования, потому что при общем использовании, если файл по какой-либо причине заблокирован или недоступен после того, как file_exists вернется TRUE, это то, что вам нужно заметить с очень уродливым сообщением об ошибке прямо на лице последнего пользователя, иначе вы будете открыты для неожиданного и необъяснимого поведения позже с возможной потерей данных и тому подобным.