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 возвращает список файлов и директорий внутри указанного пути. Её используют, когда требуется не только проверить существование папки, но и получить её содержимое. В случае ошибки или если путь не является директорией, функция вернёт 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 была усилена типобезопасность. Передача аргументов нескалярных типов (кроме строк) теперь вызывает ошибку 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
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
$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
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
В среде 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-запросы, если не используются специальные расширения или хранимые процедуры, обращающиеся к системе.