On Feb 26, 2013, at 10:00 AM, Benjamin Eberlei <kont...@beberlei.de> wrote:
> This is indeed not possible, because strings are not class context > independent, you can pass them to anywhere. A string just doesn't know what > namespace it belongs to and this does not make sense without providing more > context in client libraries (such as docblocks). > > Also the use statement information is NOT available in the engine, because > its resolved way before in the compiling step (as far as i understood it). Thankyou for clarifying this. It was really all I wanted to know. I guess this discussion is dead (though it birthed a different discussion, which is also impossible to follow since it is laced with flames) I'm pulling out of this one. Thankyou all. > > What Doctrine Annotations does to solve this is parsing this information > ourselves, using token_get_all(), then caching this information on a per file > basis. > > > On Tue, Feb 26, 2013 at 8:25 AM, Jens Riisom Schultz <ibmu...@me.com> wrote: > 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 > >