On 9 March 2021 22:15:49 GMT, "Kévin Dunglas" <[email protected]> wrote:
>Hi folks,
>
>Currently, it's not possible to use the ::class special constant with
>the
>constant() function. This doesn't work:
>
>var_dump(
> constant('\DateTime::class')
>);
While this looks logical at first glance, I'm not sure this can actually work,
because you are asking at runtime for information which only exists at compile
time. This is similar to other "magic" constants such as __LINE__.
The only cases where ::class is calculated at runtime are self::class, and the
recently added $obj::class, where $obj is an object instance. All other uses
are expanded by the compiler based on the namespace and use statements in
effect at that point in the code. If you try to calculate it at runtime, it
would end up being evaluated where the call to constant() happens, which
wouldn't actually have those namespace and use directives in effect.
Consider this example:
namespace Acme\Foo {
use Some\Other\Baz;
function test(string $class) {
echo constant($class . '::class');
}
}
namespace Acme\Different {
use Acme\Bar\Baz as BarBaz;
echo Baz::class, PHP_EOL;
echo BarBaz::class, PHP_EOL;
echo test('Baz');
echo test('BarBaz');
}
Logically, the calls to test() should result in the same output as the direct
use of "::class", but the call to constant() is in a different namespace, with
different use statements. I'm not sure if use statements are even available at
runtime, but if they were, there would be no way of knowing that the context of
the call to test() should be used, not the context where it's defined.
Regards,
Hi Kevin,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php