Re: Late FQCN resolution using ::class

From: Date: Tue, 26 Feb 2013 07:25:21 +0000
Subject: Re: Late FQCN resolution using ::class
References: 1 2  Groups: php.internals 
Request: Send a blank email to [email protected] to get a copy of this message
Ok I get that, thankyou for the explanation.

static::class is not an option. I'm trying to resolve class names defined in docblocks, since
phpdoc2 allows for entering type hints (classes) as namespace/use relative. And I can tell there is
no current way of resolving class names in strings, to FQCN's, unless I'm missing
something? (There is no way to get a list of the currently used namespaces as far as I can tell -
would such a function be possible to add to the SPL, without any major rewriting?)

So, I'm simply wondering if this would require any major rewriting to support? Otherwise I
could look into it and try to write a patch... Because I think this would be really useful for
framework developers, php unit testing and php doc for example.

-Jens

On Feb 25, 2013, at 11:20 AM, Nikita Nefedov <[email protected]> wrote:

> On Mon, 25 Feb 2013 14:00:04 +0400, Jens Riisom Schultz <[email protected]> wrote:
> 
>> Hi everybody,
>> 
>> I have read up on this, and done some testing.
>> 
>> First up, my findings with PHP5.5 alpha5:
>> 
>> <?php
>> namespace spacy;
>> 
>> class classy {
>>        public static function fqcn() {
>>                /* This works but is not useful enough: */
>>                //return self::class;
>> 
>>                $me = 'classy';
>> 
>>                /* This just doesn't work, but I wish it did: */
>>                //return $me::class;
>> 
>>                /* This simply does not work as expected: */
>>                return eval("return $me::class;");
>>                /* Output: "classy" - Expected output: "spacy\classy" */
>>        }
>> }
>> ?>
>> 
>> I'm trying to late resolve a class name contained in a variable to the FQCN. I
>> understand that this is hard (maybe even impossible) with the current implementation, because class
>> name resolution happens compile time, but eval("return $me::class;") simply returns
>> something that is weird.
>> 
>> I guess what I'm trying to ask is whether it would be impossible to support late FQCN
>> resolution in any way? It would be very useful for frameworks to be able to do this.
>> 
>> - Jens Riisom Schultz
>> --
>> PHP Internals - PHP Runtime Development Mailing List
>> To unsubscribe, visit: http://www.php.net/unsub.php
>> 
> 
> Hi Jens,
> 
> Here's what happened in your code:
> When you invoked fqcn(), you created var $me = "classy";
> Then you tried to invoke this code in eval: "return classy::class;"
> But when php evals code, it's like including another file. So it executes the code without
> any namespace (it's in global namespace), and php didn't discover class with name classy
> (there's only spacy\classy) yet, so it tries to resolve all your "use" statements
> (but you didn't write any) and then just gives you "classy", it didn't throw any
> error just because it tried to delay autoloading of this class as far as possible, if would do
> eval("return new $me;") then you would get fatal error.



Thread (16 messages)

« previous php.internals (#66230) next »