On 13 May 2023 10:04:39 BST, Lydia de Jongh <flexj...@gmail.com> wrote:

>I prefer a magic constant like `::name` instead of a function call as it
>can be used in a wider scope; for example as a parameter in an Attribute.

Don't confuse the syntax with the implementation: "::class" isn't actually a 
constant, and the proposed "nameof()" isn't actually a function; both are just 
syntaxes understood by the compiler to generate strings according to certain 
rules. The RFC explicitly mentions use in attributes:

> The nameof() function is not necessarily a function in the traditional sense 
> and can be used anywhere a string literal can be used (such as to define 
> static constants, array keys, and attributes).


I'm lukewarm on the RFC myself - I can't think of many places I'd use it, and 
some of the use cases feel like they would ideally not involve strings at all. 
But I can't actually think of a good reason *not* to include it.


The one part of the RFC that surprised me was this:

> When getting the name of constants and functions, the name will NOT be the 
> full name, but the lexical name. This means that if the name is use'd, it 
> will be that name. However, if the full name is used in the nameof(), the 
> full name is returned.

No reason is given *why* it works this way, and expanding the namespaces on a 
name is one of the most useful features of "::class". Importantly, it means 
that the string created can be passed to other contexts, and still refer to the 
same thing. For instance:

use function Acme\bar as foo;
...
#[SomeAttribute(callback: nameof(foo(...))]
...

The attribute constructor, defined in a different file, can't do anything 
useful with the string 'foo'; it needs to know the qualified name of the 
function the user referenced, 'Acme\bar'.


Similarly, I'm not wholly clear why nameof(MyClass::method(...)) should 
evaluate to "method" rather than "MyClass::method" or indeed 
"Full\NamespaceOf\MyClass::method". Some more details on what exactly it 
evaluates to for each type, and why, would be helpful.

Regards,

-- 
Rowan Tommins
[IMSoP]

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php

Reply via email to