Re: simple solution to another namespace conundrum?
| From: | Dmitry Stogov | Date: | Fri, 20 Jun 2008 16:10:41 +0000 |
| Subject: | Re: simple solution to another namespace conundrum? | ||
| References: | 1 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-38476@lists.php.net to get a copy of this message | ||
Looks fine, but probably we should emit error only if class declared in
the same source file.
Thanks. Dmitry.
Gregory Beaver wrote:
> Hi,
>
> You probably have seen Derick's blog post
> http://www.derickrethans.nl/namespaces_in_php.php
>
> It occurred to me today that there might be a simple, elegant solution
> to this problem.
>
> First, let's imagine someone writes this code:
>
> <?php
> include '/path/to/library/Closure.php';
> use Fancy::Closure;
>
> $a = new Closure('for ($a = 1;$a<10;$a++) docrap();');
> ?>
>
> Now, in PHP 5.4, we introduce an internal class "Closure" and the user's
> code suddenly breaks on the "use" statement because we check for an
> internal name conflict.
>
> Here's the kicker: why do we need to worry about a name conflict? This
> user's code was designed to work exclusively with Fancy::Closure, and
> doesn't care about any present or future internal classes that
> conflict! Also, because this is a compile-time alias that only affects
> the current script file, if we were to allow the above user's code to
> essentially override the internal Closure class, there is no possible
> harm because
>
> 1) the user explicitly imported Fancy::Closure
> 2) the user therefore never intends to use the internal ::Closure in
> this script
>
> In fact, the same thing is true for existing classnames. Why should we
> care if a user does this?
>
> <?php
> include '/path/to/my/date/lib.php';
> use My::DateTime;
>
> $a = new DateTime('2006/04/05');
> ?>
>
> The user is obviously intentionally creating a "DateTime" class, and
> doesn't care about the internal classname in this script.
>
> The attached patch against PHP_5_3 would fix the issue by eliminating
> the check for conflict with CG(class_table) in the global namespace for
> internal classes. It however preserves this check for userspace classes
> so that (for instance) php-src/tests/Zend/ns_030.phpt does not fail.
> The basic idea is that we do have control over the userspace classes we
> include, but have no control over the internal classes.
>
> A new test would also be needed:
>
> 066.php.inc:
> <?php
> namespace A;
> class B
> {
> function __construct(){echo __CLASS__;}
> }
> ?>
>
> --TEST--
> 066: Name ambiguity (import name & internal class name)
> --FILE--
> <?php
> include __DIR__ . '/066.php.inc';
> use A::B as stdClass;
>
> new stdClass();
> --EXPECT--
> A::B
>
> Thanks,
> Greg
>