Получить полное имя класса из неквалифицированного имени класса

#php #namespaces

#php #пространства имен

Вопрос:

Как я могу заставить это работать?

 <?php
namespace Target {
  
  class FooBar {
  
  }
}

namespace Test {
  
  use TargetFooBar;

  $class = 'FooBar';

  var_dump(new ReflectionClass(new $class));

}
 

На данный момент это не удается, потому что класс отражения находит только классы с полным пространством имен. Как я могу изменить это, чтобы он получал класс из инструкций use? Если есть функция, которую я пропускаю. Попытка таких вещей, как $class::class also, просто приводит к ошибке.

Моя цель — иметь возможность работать с аннотациями для массивов, например:

 <?php
namespace Target {
  use FooBar;
  
  class FooBar {
    /**
     * @var Bar[]|null
     */
    public ?array $foo;
  }
}
 

Возможно, то, что я делаю, невозможно, и я должен просто указать полное имя класса в аннотациях.

Я работаю с PHP7.4

Комментарии:

1. $class = FooBar::class должно работать в паре с new ReflectionClass(new $class) . Или я неправильно понял вопрос?

2. use Операторы являются синтаксическими сокращениями. В скомпилированном коде они не существуют, и имена классов являются полными.

Ответ №1:

Боюсь, это невозможно. Согласно документации PHP, в имени динамического класса должно использоваться полное имя класса.

Необходимо использовать полное имя (имя класса с префиксом пространства имен). Обратите внимание, что, поскольку нет разницы между полным и полным именем внутри динамического имени класса, имени функции или имени константы, начальная обратная косая черта не требуется.

 <?php

namespace Target {
    class FooBar
    {
    }
}

namespace Test {
    $class = 'TargetFooBar';

    var_dump(new ReflectionClass(new $class));
}
 

В качестве альтернативы, есть возможность анализировать инструкции use и извлекать оттуда полное имя класса, хотя этот способ немного сложен.
github.com/Kdyby/ParseUseStatements

Комментарии:

1. Я обнаружил, что с тех пор это возможно, но только с помощью дополнительного фрагмента кода для анализа инструкций use исходного файла, как это делает эта библиотека github.com/Kdyby/ParseUseStatements

2. О, по-видимому, это возможно, да. Но это очень, очень хакерский способ. Конечно, это вариант, если его невозможно избежать. Спасибо за обновление.