Get included files: примеры (PHP)

Руководство по функции 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__

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

spl_autoload_functions()

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

Предпочтения: Для анализа всех включенных файлов используется get_included_files(). Для проверки, был ли уже подключен конкретный файл, иногда эффективнее использовать условные операторы include_once/require_once или проверять существование определенной константы, объявленной в этом файле.

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

Python (sys.modules)

В Python нет прямой аналогии, но словарь sys.modules содержит все когда-либо импортированные модули.

import sys
import os

print(list(sys.modules.keys())[:5])  # Первые 5 ключей
['sys', 'builtins', '_frozen_importlib', '_imp', '_thread']
JavaScript (Node.js - require.cache)

В 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

Начиная с PHP 5, функция всегда возвращает абсолютные пути, разрешенные с помощью реального пути (realpath).

PHP 8

В PHP 8 значительных изменений в работе функции не произошло. Она полностью сохранила обратную совместимость.

Расширенные примеры использования

Анализ структуры проекта

Скрипт для вывода дерева включенных файлов.

Пример php
<?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
<?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
<?php
// В начале скрипта
$startFiles = get_included_files();

// ... выполнение основной логики ...

// В конце
$endFiles = get_included_files();
$loadedDuringExecution = array_diff($endFiles, $startFiles);

file_put_contents('debug.log',
    "Загружено во время выполнения:\n" .
    implode("\n", $loadedDuringExecution)
);
?>

PHP get_included_files function comments

En
Get included files Returns an array with the names of included or required files