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 internals+get-66230@lists.php.net 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 <inefedor@gmail.com> wrote: > On Mon, 25 Feb 2013 14:00:04 +0400, Jens Riisom Schultz <ibmurai@me.com> 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.

« previous php.internals (#66230) next »