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