В php есть ли способ определить, использовался ли :: class при генерации строки? - PullRequest
1 голос
/ 25 февраля 2020

Два следующих оператора возврата будут возвращать одну и ту же строку:

getClassName(): string
{
    return MyClassName::class; // returns 'MyClassName'
    return 'MyClassName';      // returns 'MyClassName'
}

У нас также есть код, который вызывает этот метод.

$className = getClassName();

В нашем коде, который вызывает этот метод, есть есть ли способ определить, использовался ли ::class для генерации строки?

IDE, которые мы используем, способны определять, когда используется ::class, и мы хотели бы как-то использовать эту логику c в нашем коде во время компиляции.

1 Ответ

2 голосов
/ 03 апреля 2020

IDE могут посмотреть исходный код и посмотреть, какой синтаксис вы используете. Они используют это для предоставления подсказок, перекрестных ссылок и всего прочего, что они делают во время редактирования.

Но как только код скомпилирован и запущен, большая часть этой информации отбрасывается. Значения не имеют никакой информации о том, как они были рассчитаны - строка - это просто набор символов. Существуют функции отражения, которые позволяют получить доступ к стеку вызовов, чтобы увидеть, какие функции были вызваны, поскольку это необходимо в памяти для реализации возврата, но данные не отслеживают, откуда пришли значения.

Таким образом, нет встроенного способа получить информацию, которую вы ищете. Если вам нужно следить за этим, вам придется реализовать его в самом коде приложения.

getClassName(): array
{
    return ['source' => '::class', 'value' => MyClassName::class];
    return ['source' => 'string', 'value' => 'MyClassName'];
}
...