В PHP есть способ получить все объявленные классы в определенном пространстве имен? - PullRequest
5 голосов
/ 16 декабря 2011

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

Я пытался позвонить get_declared_classes(), но по какой-то причине доступные мне классы не отображаются.Я могу позвонить get_declared_classes(), не видеть Event в списке, а затем сразу же позвонить $x = new Event() без проблем.Что-то вроде следующего, что, я думаю, должно вызвать проблемы ...

if (! in_array('Event', get_declared_classes())) { $x = new Event(); }

... работает нормально.Мне интересно, поможет ли пространство имен этих классов и их извлечение облегчить проблему.Возможно ли это?

РЕДАКТИРОВАТЬ: Для пояснения, позвольте мне добавить, что я в настоящее время не использую пространства имен, и я не пытаюсь специально достичь чего-то из приведенного выше кода.Я хочу получить имена всех классов, которые я объявил.Несмотря на то, что объявления классов для всех них выполняются до того, как я вызову get_declared_classes(), они не все появляются в списке.Я надеялся, что пространство имен может помочь решить проблему.

РЕДАКТИРОВАТЬ 2: Некоторые люди указали, что классы могут быть загружены автоматически.Я проверил это, выполнив следующее.echo(class_exists('Event')) вернул значение 1.echo(class_exists('Event', FALSE)) вернул значение 0. Второй, необязательный параметр для class_exists - это автозагрузка или нет.Итак, по-видимому, класс загружается автоматически.Это отвечает на это.

Итак, следующий вопрос - как мне это предотвратить?Я использую фреймворк, который действительно не дает мне много контроля на низком уровне.Есть ли способ принудительной автозагрузки, ТОГДА позвоните get_declared_classes или для get_declared_classes сначала запустить автозагрузку?

1 Ответ

5 голосов
/ 16 декабря 2011

Вам не нужно жестко кодировать его в коде, вы можете использовать имя переменной:

$class_name = 'Event';
if (!in_array($class_name, get_declared_classes())) {
    $x = new $class_name();
};

Смотрите похожий код в действии здесь: codepad.org / hCLE4ToA .

Кроме того, некоторые классы могут не отображаться в результате get_declared_classes(), поскольку они могут не загружаться во время вызова этой функции. Это может быть тот случай, если они автоматически загружаются после того, как вы попытаетесь их создать. Подробнее об автозагрузке классов смотрите здесь: php.net / autoload .

Это отвечает на некоторые ваши вопросы? Помогло ли это?

...