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

Reply via email to