Julian,

Regarding the name resolution rules, I posted a patch a few months ago with what I think is a more reasonable lookup order (http://news.php.net/php.internals/34097), but did not get much feedback. Would you like to try it out? (let me know if it doesn't apply cleanly against the current PHP_5_3)


Regards,

Jessie Hernandez
Zend Certified Engineer (http://zend.com/zce.php?c=ZEND006359&r=222727282)



Julian Reich wrote:
Hi,

I recently started porting an application to PHP 5.3.

1. While testing the new namespace implementation I noticed the following:

<?php
namespace Test1;
function fooBar() { echo 'Test1::fooBar()' . PHP_EOL; }

namespace Test2;
use Test1;
Test1::fooBar();

Executing the code above results in a warning: "The use statement with non-compound name 'Test1' has no effect in [...]". I understand the rationale behind this warning but it simply isn't true: omitting the use statement results in a fatal error: "Class 'Test2::Test1' not found in [...]".

Since the following code executes without warning or error I think the code above (without use statement) should also execute just fine.

<?php
namespace Test1::Test2;
function fooBar() { echo 'Test1::Test2::fooBar()' . PHP_EOL; }

namespace Test3;
Test1::Test2::fooBar();

But I'm not quite sure about the warning (about the non-compound use statement): I think the warning should either be dropped or its statement should be fulfilled.


2. I'm sorry for bringing this up again: The current name resolution order makes using the namespace feature in conjunction with autoloading less usable and somewhat error prone.

a. To avoid that internal classes introduced to PHP somewhen in the future break my app I've to add a number of use statements that would not be necessary otherwise.
       So to be on the safe side one has to
i. "use" all classes from the current namespace which is annoying and especially in bigger projects one might easily forget to "use" classes when making changes ii. use exactly one file per namespace (this might work well especially with few classes per namespace that are mostly used together, but one can easily think of a lot of situations you want to load just the classes that are really needed and in the end this is what autoload is for)
          iii. avoid the usage of autoload

   b. Applications might behave differently when packaged
i. one class per file using autoload (without "use"-ing classes from the current namespace)
          ii. all classes in one file

c. Implementors of autoloaders can keep the performance hit to a minimum using some kind of caching.

I think the current resolution order is a WTF-factor especially for unexperienced users or users coming from other languages.

I know that the above arguments might have been already on this list but I couldn't find some definitive decision to keep the current name resolution order. If I've missed that I'm sorry for the noise.


Regards,
Julian Reich

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to