Скрипт не видит раннее подключенные модули

95
08 мая 2021, 06:10

У меня есть файл config.php, где идет установка некоторых строковых констант (define), которые содержат в себе абсолютные пути к директориям файла, так же подключает (include_once) некоторые другие скрипты со всякими функциями и классами.

config.php

// заносим директории в константы
define('DIR_ROOT', $_SERVER['DOCUMENT_ROOT']);
define('DIR_CORE', DIR_ROOT . '/Core');
define('DIR_LIBRARY', DIR_CORE . '/Library');
define('DIR_CONTROLS', DIR_ROOT . '/Controls');
// подключаем лог
include_once(DIR_LIBRARY . '/Log.php');
// подключаем всю стандартную бибилотеку
include_once(DIR_CORE . '/fIncludeStandartLibrary.php');
Log::Add("либы подключены");

fIncludeStandartLibrary.php

$path = DIR_LIBRARY;
$content = scandir(DIR_LIBRARY);
foreach ($content as $key => $name) {
    if (is_file("$path/$name") && $name != 'Log.php' && ($name != '.' && $name != '..')) {
        Log::Add("<p>include $path/$name</p>");
        include_once("$path/$name");
    }
}
unset($content);

Здесь был обход папки из моей "стандартной библиотеки" и подключением их.

index.php

include_once('config.php');
RenderControl('header');
RenderControl('register form');
RenderControl('footer');

И сам fRendeControl.php

function RenderControl($controlName)
{
    $ctrlDir = DIR_CONTROLS . "/$controlName";
    if (file_exists($ctrlDir)) {
        $content = scandir($ctrlDir);
        foreach ($content as $key => $name) {
            if (!is_dir("$ctrlDir/$name") && $name != '.' && $name != '..') {
                include("$ctrlDir/$name");
                Log::Add("include $ctrlDir");
            } elseif ($name != '.' && $name != '..') {
                Log::Add("Not found $ctrlDir - $name");
            }
        }
    } else {
        Log::Add("Not exist $controlName");
    }
}

И, казалось бы, что в дальнейшем все подключенные скрипты должны позволять использовать свои функции\классы в любом месте сайта. И отчасти оно так и было, до некоторого момента. Но за пределами index.php RenderControl уже является неизвестной функцией. Понимаю, что пишу жуткий костыль с кучей дыр, но объясните, пожалуйста, наиболее слабое место здесь.

Answer 1

1) Проверьте, подключается ли вообще ваш файл с RenderControl(). Может ошиблись в логике. Прямо в файле с RenderControl() пропишите и проверьте.

echo "RenderControl() exists";
die();

2) Если подключается, возможно вы используете namespace. Т.е если вы определили функцию в файле без namespace, а потом пытаетесь ее использовать в namespace, то надо ставить знак обратного слэша. Ну либо прописывать namespaceфункции.

\RenderControl();
\namespace\RenderControl();
READ ALSO
Получить индекс заголовка столбца

Получить индекс заголовка столбца

Всем доброго времени суток! Делаю одно задание и столкнулся с небольшой трудностьюУ меня есть некий csv файл с названиями столбцов - (За период;Учетный...

110
Почему нельзя удалять элементы из коллекции в цикле for-each?

Почему нельзя удалять элементы из коллекции в цикле for-each?

Почему нельзя удалять из коллекции в цикле for-each?

95
Реклама ломает программу

Реклама ломает программу

Сначала когда запускаешь приложение все работает и тема и соответствие цветов все окНо когда вызываешь метод Update цвета и тема устанавливаются...

83
Как привязать лист к ключу HashMap?

Как привязать лист к ключу HashMap?

Как в HashMap при добавлении нового ключа создавать новый лист, который принадлежит только этому ключу, и как обращаться к нему?

98