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

Функция is_dir в PHP: проверка существования папки
Раздел: Работа с файловой системой
is_dir(string $filename): bool

Функция is_dir в PHP

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

Назначение и сфера применения

Функция используется в сценариях, где требуется валидация или обработка файловой структуры. Её применение актуально при создании файловых менеджеров, организаторов контента, систем кэширования, а также в скриптах, которые обходят директории для обработки их содержимого.

Аргументы функции

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

  • filename (тип string) - путь к проверяемому файлу или директории. Может быть абсолютным или относительным.

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

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

Базовый пример проверки
<?php
$path = 'uploads';
if (is_dir($path)) {
    echo "Директория $path существует.";
} else {
    echo "$path не является директорией или не существует.";
}
?>
Директория uploads существует.
Использование с абсолютным путём
<?php
$path = '/var/www/project/temp';
var_dump(is_dir($path));
?>
bool(true)
Проверка результата при отсутствии объекта
<?php
var_dump(is_dir('несуществующая_папка'));
?>
bool(false)

Альтернативные функции в PHP

В PHP существует несколько функций для работы с файловой системой, которые могут служить альтернативами или дополнениями к is_dir.

Функция file_exists проверяет существование файла или директории. Она возвращает true для обоих типов, что требует дополнительной проверки типа, если это критично.

Функция is_file является прямой противоположностью is_dir для проверки обычных файлов. Её применяют, когда нужно удостовериться, что путь ведёт именно к файлу, а не к директории.

scandir

Функция scandir возвращает список файлов и директорий внутри указанного пути. Её используют, когда требуется не только проверить существование папки, но и получить её содержимое. В случае ошибки или если путь не является директорией, функция вернёт false.

Выбор функции

Функцию is_dir предпочтительно использовать для точной проверки типа объекта. file_exists подходит для общей проверки существования. is_file применяют для проверки файлов. scandir нужна для получения содержимого директории.

Типичные ошибки при работе с is_dir

Проверка без учёта прав доступа

Функция может вернуть false для существующей директории, если у процесса PHP недостаточно прав для чтения информации о ней.

<?php
// Предположим, директория /root/secured недоступна для чтения
var_dump(is_dir('/root/secured'));
?>
bool(false)
Использование неверного типа аргумента

Передача аргумента, отличного от строки, приводит к предупреждению и возврату false.

<?php
var_dump(is_dir(123));
?>
Warning: is_dir() expects parameter 1 to be a valid path, integer given
bool(false)
Путаница с относительными путями

Относительные пути вычисляются относительно текущей рабочей директории скрипта, что может привести к неожиданным результатам, если она изменена.

<?php
chdir('/tmp');
// Проверка происходит относительно /tmp, а не исходной директории
var_dump(is_dir('uploads'));
?>

История изменений функции

Функция is_dir присутствует в PHP с ранних версий и сохраняет стабильное поведение. Значительные изменения в её работе не отмечались.

PHP 8.0

В PHP 8.0 была усилена типобезопасность. Передача аргументов нескалярных типов (кроме строк) теперь вызывает ошибку TypeError. Ранее такие случаи приводили к предупреждению и возврату false.

<?php
// В PHP 7.x: Warning и false
// В PHP 8.0: TypeError
var_dump(is_dir([]));
?>
Fatal error: Uncaught TypeError: is_dir(): Argument #1 ($filename) must be of type string, array given

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

Рекурсивный обход директорий

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

Пример php
<?php
function listDirectories($path) {
    if (!is_dir($path)) {
        return [];
    }
    $items = scandir($path);
    $dirs = [];
    foreach ($items as $item) {
        if ($item === '.' || $item === '..') continue;
        $fullPath = $path . DIRECTORY_SEPARATOR . $item;
        if (is_dir($fullPath)) {
            $dirs[] = $fullPath;
            $dirs = array_merge($dirs, listDirectories($fullPath));
        }
    }
    return $dirs;
}
print_r(listDirectories('.'));
?>
Валидация загружаемых путей

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

Пример php
<?php
$userInput = $_POST['folder_path'] ?? '';
$basePath = '/var/www/allowed/';
$fullPath = realpath($basePath . $userInput);

// Защита от directory traversal и проверка типа
if ($fullPath && strpos($fullPath, $basePath) === 0 && is_dir($fullPath)) {
    echo "Доступ к директории разрешён.";
} else {
    echo "Неверный путь.";
}
?>
Кэширование результатов проверки

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

Пример php
<?php
function is_dir_cached($path, &$cache = []) {
    if (!array_key_exists($path, $cache)) {
        $cache[$path] = is_dir($path);
    }
    return $cache[$path];
}
$cache = [];
var_dump(is_dir_cached('/tmp', $cache));
var_dump(is_dir_cached('/tmp', $cache)); // Второй вызов использует кэш
?>

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

Is dir в Python

В языке Python для проверки типа файлового объекта используется функция os.path.isdir() из модуля os.path.

import os
path = 'uploads'
print(os.path.isdir(path))
True
JavaScript (Node.js)

В среде Node.js применяют асинхронный метод fs.stat() или синхронный fs.statSync() из модуля fs, а затем проверяют свойство isDirectory().

const fs = require('fs');
const path = 'uploads';
fs.stat(path, (err, stats) => {
    if (err) console.log(false);
    else console.log(stats.isDirectory());
});
true

Is dir в MySQL

В СУБД MySQL прямой аналогичной функции не существует. Информация о файловой системе обычно не доступна через SQL-запросы, если не используются специальные расширения или хранимые процедуры, обращающиеся к системе.

PHP is_dir function comments

En
Is dir Tells whether the filename is a directory