Функция cot_get_caller в Cotonti
Разбор функции cot_get_caller
Функция cot_get_caller используется для получения имени файла, который вызвал текущую функцию или код, обычно в контексте плагинов. Это полезно для определения того, откуда был включен текущий файл, например, в случае с хуками или подключаемыми частями кода.
Код функции
/**
* Returns name part of the caller file. Use this in plugins to detect from which file
* current hook part was included. Example:
* <code>
* if (cot_get_caller() == 'users.details')
* {
* // We are called from users.details
* }
* else if (cot_get_caller() == 'header')
* {
* // We are called from header
* }
* </code>
* @return string Caller file basename without .php suffix on success, 'unknown' or error
*/
function cot_get_caller()
{
$bt = debug_backtrace();
if (isset($bt[1]) && in_array($bt[1]['function'], array('include', 'require_once', 'require', 'include_once')))
{
return preg_replace('#\.php$#', '', basename($bt[1]['file']));
}
else
{
return 'unknown';
}
}
Описание:cot_get_caller()
Параметры:
Нет параметров.
Возвращаемое значение:
Строка с именем файла, вызвавшего текущую функцию, без суффикса .php, или строка 'unknown', если невозможно определить источник вызова.
Логика работы:
Получение информации о стеке вызовов:
С помощью функции debug_backtrace() собирается стек вызовов. Эта функция возвращает массив, который содержит информацию о функциях, которые были вызваны до текущего момента. Каждый элемент массива включает в себя информацию о функции, файле, строке, а также переданных параметрах.
$bt = debug_backtrace();
Проверка, был ли вызов через include или require:
Далее проверяется, был ли текущий вызов вызовом одной из функций, связанных с подключением файлов (include, require_once, require, include_once). Для этого используется условие:
if (isset($bt[1]) && in_array($bt[1]['function'], array('include', 'require_once', 'require', 'include_once')))
Если это так, то проверяется второй элемент массива стека вызовов ($bt[1]), который представляет собой информацию о вызове функции, которая подключала файл.
Возврат имени файла:
Если вызов был сделан через одну из вышеуказанных функций, из полученного массива извлекается имя файла ($bt[1]['file']) и используется функция basename для получения имени файла без пути.
Затем с помощью preg_replace удаляется суффикс .php, если он присутствует:
return preg_replace('#\.php$#', '', basename($bt[1]['file']));
Возврат значения по умолчанию:
Если вызов не был сделан через include или require, или если не удается найти необходимую информацию в стеке вызовов, функция возвращает строку 'unknown':
return 'unknown';
Пример работы функции:
Предположим, у вас есть два файла:
header.php
users.details.php
Если в одном из этих файлов вызывается функция cot_get_caller, она вернет имя файла, откуда был сделан вызов.
Пример использования:
if (cot_get_caller() == 'users.details') {
// Вызов был сделан из файла users.details.php
} else if (cot_get_caller() == 'header') {
// Вызов был сделан из файла header.php
}
if (cot_get_caller() == 'page.add') {
$pfs_tag = 'PAGEADD';
} else {
$pfs_tag = 'PAGEEDIT';
}
Если функцию вызывают из файла, который не подключает другие файлы с помощью include или require, функция вернет 'unknown'.
Примечания:
Эта функция полезна для диагностики и отладки, особенно в плагинах, чтобы понимать, откуда именно был вызван определенный кусок кода.
Для работы этой функции требуется, чтобы код был вызван через механизмы подключения файлов (например, include или require), так как debug_backtrace() зависит от стека вызовов, который формируется при таких операциях.
Комментарии (0)
Автор контента
Оффлайн
Administrator
Последняя авторизация: 05.07.2026 18:32
- Страница размещена: 21.01.2025 11:57
- Последнее обновление: 21.01.2025 11:57