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.