Get included files: примеры (PHP)
get_included_files: arrayФункция get_included_files() возвращает индексный массив с именами всех файлов, которые были включены или затребованы с помощью include, include_once, require, require_once в процессе выполнения текущего скрипта.
Основное применение — отладка и анализ зависимостей скрипта. Она помогает понять, какие файлы были загружены, отследить цепочку включений, обнаружить непреднамеренные повторные подключения или выявить проблемы с автозагрузкой.
Функция не принимает никаких параметров.
Вызов: get_included_files ( ) : array.
Возвращаемое значение — массив строк (путей к файлам) в порядке их включения. Сценарий, выполняющий вызов, также присутствует в этом списке под именем main.
Простые примеры
Пример показывает результат после включения файлов.
<?php
// index.php
include 'header.php';
require 'config.php';
include_once 'functions.php';
$files = get_included_files();
print_r($files);
?>Array
(
[0] => /var/www/project/index.php
[1] => /var/www/project/header.php
[2] => /var/www/project/config.php
[3] => /var/www/project/functions.php
)Использование функции для условной логики.
<?php
// utils.php
if (!in_array(__FILE__, get_included_files(), true)) {
die('Прямой доступ запрещен.');
}
?>Похожие средства в PHP
Функция get_required_files() является псевдонимом для get_included_files(). Они возвращают идентичные данные. Использование одного или другого — вопрос стиля.
Константа __FILE__ возвращает полный путь и имя текущего файла. Она часто используется внутри подключаемого файла для получения собственного пути, что может быть полезно в сочетании с get_included_files().
Функция spl_autoload_functions() возвращает зарегистрированные автозагрузчики. Она помогает анализировать механизм автоматической загрузки классов, что косвенно связано с подключением файлов.
Предпочтения: Для анализа всех включенных файлов используется get_included_files(). Для проверки, был ли уже подключен конкретный файл, иногда эффективнее использовать условные операторы include_once/require_once или проверять существование определенной константы, объявленной в этом файле.
Аналоги в других языках
В Python нет прямой аналогии, но словарь sys.modules содержит все когда-либо импортированные модули.
import sys
import os
print(list(sys.modules.keys())[:5]) # Первые 5 ключей['sys', 'builtins', '_frozen_importlib', '_imp', '_thread']
В Node.js объект require.cache хранит кеш загруженных модулей. Ключи — пути к файлам.
const path = require('path');
console.log(Object.keys(require.cache));['/project/node_modules/path/index.js', ...]
В отличие от PHP, где возвращается простой массив путей, в Python и JavaScript структуры данных сложнее и содержат сами объекты модулей. Механизм в PHP проще и ориентирован именно на отслеживание физических файловых включений.
Типичные ошибки
Вызов функции до любого включения файлов вернет массив только с именем основного скрипта.
<?php
// script.php
$files = get_included_files();
echo count($files); // 1
print_r($files);
?>1
Array
(
[0] => /path/to/script.php
)Функция возвращает абсолютные пути. Использование относительных путей для сравнения может привести к ошибкам.
<?php
// В файле /project/admin/index.php
include '../config.php';
$files = get_included_files();
$target = '/project/config.php'; // Абсолютный путь
var_dump(in_array($target, $files)); // true
var_dump(in_array('../config.php', $files)); // false
?>История изменений
Функция get_included_files() присутствует в PHP с очень ранних версий (PHP 4). Ее поведение остается стабильным.
Начиная с PHP 5, функция всегда возвращает абсолютные пути, разрешенные с помощью реального пути (realpath).
В PHP 8 значительных изменений в работе функции не произошло. Она полностью сохранила обратную совместимость.
Расширенные примеры использования
Скрипт для вывода дерева включенных файлов.
<?php
// main.php
include 'A.php';
include 'B.php';
function printInclusionTree() {
$files = get_included_files();
$baseDir = dirname(__FILE__);
echo "<ul>";
foreach ($files as $file) {
$relativePath = str_replace($baseDir, '.', $file);
echo "<li>$relativePath</li>";
}
echo "</ul>";
}
printInclusionTree();
?>Поиск файлов, включенных более одного раза, несмотря на использование *_once.
<?php
include_once 'lib.php';
require 'lib.php'; // Будет проигнорировано из-за once, но все равно проверим
$included = get_included_files();
$counts = array_count_values(array_map('realpath', $included));
$duplicates = array_filter($counts, fn($count) => $count > 1);
if (empty($duplicates)) {
echo "Дубликатов не найдено.";
} else {
print_r($duplicates);
}
?>Логирование всех включений для профилирования.
<?php
// В начале скрипта
$startFiles = get_included_files();
// ... выполнение основной логики ...
// В конце
$endFiles = get_included_files();
$loadedDuringExecution = array_diff($endFiles, $startFiles);
file_put_contents('debug.log',
"Загружено во время выполнения:\n" .
implode("\n", $loadedDuringExecution)
);
?>