Is file: примеры (PHP)

Проверка обычных файлов через is_file в PHP
Раздел: Работа с файловой системой
is_file(string $filename): bool

Функция is_file в PHP

Функция is_file() проверяет, является ли указанное имя файла обычным файлом. Она возвращает true, если файл существует и является обычным файлом, а не директорией, символьной ссылкой или другим специальным типом файла.

Когда используется

Функция применяется для валидации путей перед операциями чтения, записи, обработки файлов, чтобы убедиться, что путь ведет именно к файлу, а не к директории.

Аргументы

Функция принимает один обязательный параметр:

  • $filename (string) - Путь к проверяемому файлу

Возвращает bool: true если файл существует и является обычным файлом, false в противном случае.

Примеры использования is_file

Базовое использование

Проверка существования файла:

<?php
$file = 'document.txt';
if (is_file($file)) {
    echo "Файл существует";
} else {
    echo "Файл не найден";
}
?>
Файл существует
Проверка нескольких путей
<?php
$paths = [
    '/var/www/index.php',
    '/var/www/images',
    '/tmp/test.txt'
];

foreach ($paths as $path) {
    echo $path . ': ' . (is_file($path) ? 'Файл' : 'Не файл') . "\n";
}
?>
/var/www/index.php: Файл
/var/www/images: Не файл
/tmp/test.txt: Файл
Сравнение с file_exists
<?php
$path = 'data.txt';

echo "file_exists: " . (file_exists($path) ? 'Да' : 'Нет') . "\n";
echo "is_file: " . (is_file($path) ? 'Да' : 'Нет') . "\n";
?>
file_exists: Да
is_file: Нет

Похожие функции в PHP

Проверяет существование файла или директории. Возвращает true для любых типов файловых объектов. Используется, когда нужно проверить наличие любого файлового объекта без уточнения типа.

Проверяет, является ли путь директорией. Противоположна is_file() по назначению. Применяется для валидации путей к папкам.

Определяет, является ли файл символической ссылкой. Используется для работы с symlink.

is_readable() и is_writable()

Проверяют права доступа к файлу. Важно использовать после подтверждения, что путь ведет к файлу.

Рекомендации по выбору

Для проверки перед операциями с файлами используйте связку is_file() и is_readable()/is_writable(). Для простой проверки существования достаточно file_exists().

Типичные ошибки

Отсутствие проверки на false
<?php
$content = file_get_contents('missing.txt');
// Предупреждение, если файла нет
?>
Правильный подход
<?php
if (is_file('missing.txt') && is_readable('missing.txt')) {
    $content = file_get_contents('missing.txt');
} else {
    echo "Файл недоступен";
}
?>
Пути с символическими ссылками

is_file() следует за символическими ссылками:

<?php
// Создаем ссылку на директорию
symlink('/etc', 'etc_link');
echo is_file('etc_link') ? 'Файл' : 'Не файл';  // false
?>
Не файл
Некорректные пути
<?php
var_dump(is_file(''));        // false
var_dump(is_file(null));      // false
var_dump(is_file(false));     // false
?>
bool(false)
bool(false)
bool(false)
Проблемы с правами доступа

При недостаточных правах is_file() возвращает false, даже если файл существует:

<?php
// Файл с правами 000
$result = @is_file('/root/secret.txt');
echo $result ? 'Да' : 'Нет';
?>
Нет

Изменения в версиях PHP

PHP 8.0

Тип параметра стал строго string. Передача других типов вызывает TypeError.

<?php
// PHP 7.4: Предупреждение, возвращает false
// PHP 8.0: TypeError
try {
    var_dump(is_file([]));
} catch (TypeError $e) {
    echo "Ошибка типа: " . $e->getMessage();
}
?>
Ошибка типа: is_file(): Argument #1 ($filename) must be of type string, array given
PHP 5.3

Улучшена обработка символических ссылок на Windows-платформах.

PHP 5.0

Функция стала частью стандартной библиотеки, ранее была в расширении.

Расширенные примеры

Рекурсивная проверка файлов в директории
Пример php
<?php
function findFiles($directory) {
    $files = [];
    $items = scandir($directory);
    
    foreach ($items as $item) {
        if ($item === '.' || $item === '..') continue;
        
        $path = $directory . '/' . $item;
        
        if (is_file($path)) {
            $files[] = $path;
        } elseif (is_dir($path)) {
            $files = array_merge($files, findFiles($path));
        }
    }
    return $files;
}

print_r(findFiles('.'));
?>
Проверка MIME-типа файла
Пример php
<?php
function isImageFile($path) {
    if (!is_file($path)) return false;
    
    $mime = mime_content_type($path);
    return strpos($mime, 'image/') === 0;
}

echo isImageFile('photo.jpg') ? 'Изображение' : 'Не изображение';
?>
Изображение
Обработка загрузки файлов
Пример php
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $uploadDir = 'uploads/';
    $uploadFile = $uploadDir . basename($_FILES['file']['name']);
    
    if (is_file($uploadFile)) {
        echo "Файл уже существует";
    } elseif (move_uploaded_file($_FILES['file']['tmp_name'], $uploadFile)) {
        echo "Файл загружен";
    }
}
?>
Кэширование результатов проверки
Пример php
<?php
class FileChecker {
    private static $cache = [];
    
    public static function isFileCached($path) {
        if (!isset(self::$cache[$path])) {
            self::$cache[$path] = is_file($path);
        }
        return self::$cache[$path];
    }
}

// Многократные вызовы с одним путем используют кэш
echo FileChecker::isFileCached('test.txt') ? 'Да' : 'Нет';
?>
Проверка через URL wrapper
Пример php
<?php
// Проверка удаленного файла (требует allow_url_fopen)
$url = 'https://example.com/file.txt';
if (ini_get('allow_url_fopen')) {
    echo is_file($url) ? 'Доступен' : 'Недоступен';
}
?>
Фильтрация списка файлов
Пример php
<?php
$items = ['file1.txt', 'dir1', 'file2.pdf', 'dir2'];
$filesOnly = array_filter($items, 'is_file');
print_r($filesOnly);
?>
Array
(
    [0] => file1.txt
    [2] => file2.pdf
)
Проверка с обработкой ошибок
Пример php
<?php
set_error_handler(function($errno, $errstr) {
    echo "Ошибка проверки файла: $errstr\n";
});

$result = is_file("/некорректный/путь/-");
restore_error_handler();

echo "Результат: " . ($result ? 'true' : 'false');
?>

Аналоги в других языках

Is file в Python

Модуль os.path: функции isfile(), isdir(), exists()

import os
print(os.path.isfile('test.txt'))  # True
print(os.path.isdir('folder'))     # True
print(os.path.exists('test.txt'))  # True
True
True
True
JavaScript (Node.js)

Модуль fs: методы statSync(), lstatSync()

const fs = require('fs');
try {
    const stats = fs.statSync('file.txt');
    console.log(stats.isFile());  // true
    console.log(stats.isDirectory()); // false
} catch (err) {
    console.log('Файл не существует');
}
true
false

Is file в MySQL

LOAD_FILE() для чтения файлов, но проверки типа файла нет. Используются системные функции.

Bash/Shell

Оператор -f в условных конструкциях

if [ -f "file.txt" ]; then
    echo "Это обычный файл"
fi
Это обычный файл
Отличия от PHP

В Python и Node.js функции выбрасывают исключения при ошибках, в PHP возвращается false. Bash использует другие синтаксические конструкции.

PHP is_file function comments

En
Is file Tells whether the filename is a regular file