Stanislav Malyshev wrote: > Hi! > >> Shows that a namespace name with \ acts very differently from a >> namespace name without \ in imports, so I don't think it is entirely >> accurate to say that PHP namespaces don't support sub-namespacing. > > I'm afraid I don't understand what do you mean by "sub-namespacing" > besides the trivial fact that if you add foo, \ and bar you get foo\bar. > Could you please explain?
I'll try :). Aside from the import example, let's look at this code: <?php namespace foo; $a = bar\buh; ?> instantiates a class in the foo\bar namespace named buh. In other words, it instantiates class buh from the sub-namespace bar of namespace foo. This is the same as C++ nested namespaces (see the example at http://www.java2s.com/Tutorial/Cpp/0020__Language-Basics/Anestednamespace.htm) specifically: <quote> // use MyNamespace1 using namespace MyNamespace1; cout << i * MyNamespace2::j; </quote> which accesses: <quote> namespace MyNamespace1 { int i; namespace MyNamespace2 { // a nested namespace int j; } } </quote> we can do something this exact thing in PHP as: <?php namespace MyNamespace1 { const i = 1; } namespace MyNamespace1\MyNamespace2 { const j = 2; } namespace MyNamespace1 { echo i * MyNamespace2\j; } ?> The important line is "MyNamespace2\j" which resolves the same way as in the C++ example. The same principle exists in C# (from http://msdn.microsoft.com/en-us/library/z2kcy19k(VS.80).aspx): <quote> using System; namespace SomeNameSpace { public class MyClass { static void Main() { Nested.NestedNameSpaceClass.SayHello(); } } // a nested namespace namespace Nested { public class NestedNameSpaceClass { public static void SayHello() { Console.WriteLine("Hello"); } } } } </quote> which we can do in PHP as: <?php namespace SomeNameSpace { class MyClass { static function Main() { Nested\NestedNameSpaceClass::sayHello(); } } } namespace SomeNameSpace\Nested { class NestedNameSpaceClass { static function SayHello() { echo "Hello"; } } } ?> >> actually, "use \Long\Classname;" is a parse error - did we intend to >> allow it? > > I thought it was allowed, to be compatible with use \Classname. Wouldn't > hurt to do it, I think. This is trivial, and can be added after the bracketed namespace support is in 5.3 (don't forget to review the patch I sent, http://pear.php.net/~greg/bracketed.patch.txt) Thanks, Greg
