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 <inefe...@gmail.com> wrote: > On Mon, 25 Feb 2013 14:00:04 +0400, Jens Riisom Schultz <ibmu...@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. -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php