Функция 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() зависит от стека вызовов, который формируется при таких операциях.

3 минут чтения Administrator

Комментарии (0)

Комментарии отсутствуют
Добавление комментариев доступно только зарегистрированным пользователям

Автор контента

Administrator

Оффлайн

Administrator

Последняя авторизация: 05.07.2026 18:32

  • Страница размещена: 21.01.2025 11:57
  • Последнее обновление: 21.01.2025 11:57