Когда я использую file_get_contents
, is_file
, realpath
, file_exists
со строкой, которая не является путем, я получаю следующее предупреждение.
«function_name ()» ожидает, что параметр 1 будет правильным путем, строка задана в […]
Итак, как определить, может ли строка быть допустимым путем или нет.
Какого черта ты хочешь сделать? Вы можете спросить …
Ну, я хочу создать такую функцию.
funtion my_smart_function( string $path_or_content )
{
$content = is_file_without_warning_if_not_a_valid_path( $path_or_content )
? file_get_contents( $path_or_content )
: $path_or_content;
// do nice stuff with my $content
}
Иногда $path_or_content
будет действительный путь к файлу, а иногда $path_or_content
будет сам по себе содержимым файла (например, двоичные данные изображения, созданного на лету, который даже не имеет пути (по крайней мере, пока)). В последнем случае все эти функции, связанные со строками, я упоминал выше (например, file_exists()
) выдаст предупреждение (см. цитату выше).
Что-то мне интересно.
realpath('xyz')
не выдает предупреждение, но
realpath( file_get_contents('path/to/actual/image.jpg') )
делает …
Так realpath
и другие функции, упомянутые выше, различают строка или строка, которая является допустимым путем. Так как же мы можем сделать это заранее?
Спасибо заранее!
Это может быть разумным временем для использования @
модификатор для подавления ошибок.
funtion my_smart_function( string $path_or_content )
{
$content = @file_exists( $path_or_content )
? file_get_contents( $path_or_content )
: $path_or_content;
}
Если это не правильный путь, file_exists()
вернусь false
и @
будет держать его от жалоб на плохую строку.
В Linux единственным символом, который не разрешен в пути, является нулевой байт. Так что вы можете просто проверить это:
if (strpos($path_or_contents, "\0") === false) {
return file_get_contents($path_or_contents);
} else {
return $path_or_contents;
}
Я считаю, что это именно то, что вы хотите. ctype_print
проверяет, все ли символы в предоставленной строке, пригодны для печати. Если так, передайте это file_exists
,
function my_smart_function( $path_or_content )
{
$content = ctype_print($path_or_content) && file_exists( $path_or_content )
? file_get_contents( $path_or_content )
: $path_or_content;
// do nice stuff with my $content
}
Я думаю, что вы пропустили Файл существует функция. Из документации:
file_exists — проверяет, существует ли файл или каталог
bool file_exists ( string $filename )
Возвращает TRUE, если файл или каталог, указанный в filename, существует;
ЛОЖЬ в противном случае.