Hello Gregory,

Friday, November 7, 2008, 10:14:50 PM, you wrote:

> Hi,

> Stas and company decided that they wanted namespaces to have two legal
> syntax choices:

> 1) single namespace per file:

> <?php
> namespace foo;
> ...
?>>

> 2) multiple namespaces per file:

> <?php
> namespace foo1 {
> }
> namespace foo2 {
> }
?>>

> I've implemented these two syntax options in a patch found at
> http://pear.php.net/~greg/bracketed.patch.txt based on earlier work of
> Dmitry Stogov.

> It turns out there are some tricky details to work out, especially with
> regard to importing via use statements.  If we just allow global,
> un-namespaced code, for instance, we could end up with this mess:

For practical reasons outlined by you just again, we already decided not to
allow global code after any namespace declaration. That is a namespace can
only be followed by another namespace. So the rest of this analysis is
irrelevant.

marcus

> <?php
> use blah\blah;

> $f = new blah;

> namespace one {
>  use foo\bar as blah;
>  $a = new blah;
> }

> // what is this?
> blah::hi();
?>>

> Technically, you could argue that blah::hi() should resolve to
> blah\blah::hi(), but it is very difficult to track and figure out what
> "blah" means by eye.  Thus, in the patch I implemented, if bracketed
> namespace declarations exist, global use statements are not allowed, but
> must exist within namespace ns {} brackets.

> This creates a problem - how do you combine namespaced and unnamespaced
> code?  To solve this, I introduced the oft-suggested "namespace {}"
> syntax for un-namespaced code.  Thus, the above script would become:

> <?php
> namespace {
>  use blah\blah;
>  $f = new blah;
> }
> namespace one {
>  use foo\bar as blah;
>  $a = new blah;
> }
> namespace {
>  use blah\blah;
>  blah::hi();
> }
?>>

> Another important point is that imports specified by the "use" statement
> disappear when we exit a namespace block.  This way, it is very easy to
> combine un-namespaced code that uses namespaces, and namespaced code.

> Also very important to note is that the "namespace {}" syntax is
> optional for any code that does not import other things via the "use"
> statement - its sole purpose is to provide a clear visual and logical
> wrapper within which imports occur.

> Thus, this is also legal:

> <?php
> namespace newly\coded\stuff {
>  class mine { ... }
> }
> // old stuff here
> class PEAR { ... }
?>>

> Lastly, if global code does make use of namespaces, but does not import
> anything, it can also happily co-exist with bracketed namespace code:

> <?php
> namespace ns {
>  class mine { ... }
> }

> $a = new ns\mine;
> // and so on
?>>

> Thanks,
> Greg




Best regards,
 Marcus


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

Reply via email to