Список всех псевдонимов PHP


В PHP вы можете определить псевдоним класса, используя class_alias функция. Есть ли способ получить список всех псевдонимов классов, определенных в настоящее время во время выполнения?

 6
Author: worldask, 2014-09-20

2 answers

Как показывает hek2mgl, это невозможно в PHP. В зависимости от , почему вы этого хотите, могут быть приемлемые обходные пути.

Я предполагаю, что прямо сейчас вы пытаетесь обнаружить псевдонимы, созданные в стороннем коде. Затем вы можете установить модуль Runkit, установить runkit.internal_override на 1, чтобы включить модификацию собственных функций, и сделать что-то подобное в корневом файле вашего проекта:

runkit_function_rename('class_alias', 'class_alias_internal');
function class_alias($original, $alias, $autoload = TRUE)
{
    Logsomewhere("Creating alias from $original to $alias!");
    class_alias_internal($original, $alias, $autoload);
}

Конечно, это также означает, что вы могли бы составить именно тот список, который вы ищу. Я не вижу никакого производственного использования во время выполнения для этой функции (поправьте меня, если я ошибаюсь), поэтому вам придется делать это только на сервере разработки столько, сколько потребуется. Поскольку Runkit - довольно опасный модуль, я бы даже отключил его на сервере разработчиков, как только вы закончите с ним.

Для других сценариев аналогичные обходные пути могут быть жизнеспособными, но мне нужно знать, почему вы ищете эту информацию. Что касается PHP, то предполагается, что псевдоним не может быть обнаружен, поэтому он делает его работа прекрасна (для разнообразия).

 4
Author: Niels Keurentjes, 2014-09-20 08:41:35

Взглянул на исходный код PHP. После регистрации псевдонима PHP не знает, что такое оригинал и что такое псевдоним. Например, жесткая ссылка в файловой системе. Вы можете просмотреть код в его последней версии здесь: https://github.com/php/php-src/blob/master/Zend/zend_API.c#L2728

(обратите внимание, что ссылка может устареть на момент, когда вы читаете это. затем найдите функцию zend_register_class_alias_ex.)

Однако функция, которая показывает записи таблица классов, имеющая более одной именованной ссылки на нее, может быть создана (в ядре PHP, с помощью C), но, похоже, в данный момент она недоступна.

 4
Author: hek2mgl, 2014-09-20 23:26:44