On Tue, Feb 26, 2013 at 10:08 AM, Lester Caine <les...@lsces.co.uk> wrote:

> This is an interesting discussion, and since I use phpdoc extensively,
> it's an area that I have been thinking about, but WHY do you have to make
> it so difficult to follow by simply bundling more text at the top. THIS
> needs to be quoted properly and THEN perhaps other people can follow the
> discussion. Try reading the rest of this message when you don't know what
> came before !!!!!


Sorry, forgot to post inline. Thanks for mentioning it and doing it wrong
yourself, made me laugh ;-) But you are right.

>
>
> Benjamin Eberlei 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).
>>
>> 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.
>>>
>>
> --
> Lester Caine - G8HFL
> -----------------------------
> Contact - 
> http://lsces.co.uk/wiki/?page=**contact<http://lsces.co.uk/wiki/?page=contact>
> L.S.Caine Electronic Services - http://lsces.co.uk
> EnquirySolve - http://enquirysolve.com/
> Model Engineers Digital Workshop - http://medw.co.uk
> Rainbow Digital Media - 
> http://rainbowdigitalmedia.co.**uk<http://rainbowdigitalmedia.co.uk>
>
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
>
>

Reply via email to