I am going to commit this patch on Wednesday. Thanks. Dmitry.
> -----Original Message----- > From: Dmitry Stogov [mailto:[EMAIL PROTECTED] > Sent: Wednesday, July 04, 2007 4:46 PM > To: 'internals@lists.php.net' > Subject: Simple Namespace Proposal > > > Hi, > > Please review the following concept and patch for php6... > > http://dev.daylessday.org/diff/ns-06.diff.txt > http://dev.daylessday.org/diff/tests.tar.gz > > Main assumption of the model is that the problem that we are > to solve is the problem of the very long class names in PHP > libraries. We would not attempt to take autoloader's job or > create packaging model - only make names manageable. > > Namespaces are defined the following way: > > Zend/DB/Connection.php: > <?php > namespace Zend::DB; > > class Connection { > } > > function connect() { > } > ?> > > Namespace definition does the following: > All class and function names inside are automatically > prefixed with namespace name. Inside namespace, local name > always takes precedence over global name. It is possible to > use the same namespace in several PHP files. The namespace > declaration statement must be the very first statement in file. > > Every class and function from namespace can be referred to by > the full name - e.g. Zend::DB::Connection or > Zend::DB::connect - at any time. > > <?php > require 'Zend/Db/Connection.php'; > $x = new Zend::DB::Connection; > Zend::DB::connect(); > ?> > > Namespace or class name can be imported: > > <?php > require 'Zend/Db/Connection.php'; > import Zend::DB; > import Zend::DB::Connection as DbConnection; > $x = new Zend::DB::Connection(); > $y = new DB::connection(); > $z = new DbConnection(); > DB::connect(); > ?> > > import statement only defines name aliasing. It may create > name alias for namespace or class. The simple form of > statement "import A::B::C::D;" is equivalent to "import > A::B::C::D as D;". Import statement can be used at any time > in global scope (not inside function/class) and takes effect > from the point of definition down to the end of file. It is > recommended however to place imports at the beginning of the > file. Import statements have effect only on file where they > are written. > > The special "empty" namespace (:: prefix) is useful as > explicit global namespace qualification. All class and > function names started from :: interpreted as global. <?php > namespace A::B::C; > > $con = ::mysql_connect(...); > ?> > > A special constant __NAMESPACE__ indicates the current > namespace. It can be used to construct fully-qualified names > to pass them as callbacks. > > <?php > namespace A::B::C; > > function foo() { > } > > set_error_handler(__NAMESPACE__ . "::foo"); > ?> > > In global namespace __NAMESPACE__ constant has value of empty string. > > Names inside namespace are resolved according to the following rules. > > 1) all qualified names are translated during compilation > according to current import rules. So if we have "import > A::B::C;" and then "C::D::e();" it is translated to "A::B::C::D::e()" > 2) unqualified class names translated during compilation > according to current import rules. So if we have "import > A::B::C;" and then "new C();" it is translated to "new A::B::C()" > > 3) calls to unqualified functions that are defined in current > namespace interpreted as calls to corresponding functions > 4) calls to unqualified functions that are not defined in > current namespace are resolved in run-time. The call to > function foo() inside namespace (A::B) first tries to find > and call function from current namespace A::B::foo() and if > it doesn't exist PHP tries to call internal function foo(). > Note that using foo() in namespace you can call only internal > PHP functions, however using ::foo() you are able to call any > function from global namespace. > 5) unqualified class names are resolved at run-time. E.q. > "new Exception()" first tries to use (end even __autoload()) > class from current namespace and in case of failure uses > internal PHP class. Note that using "new A" in namespace you > can call only create internal PHP class, however using "new > ::A" you are able to create any class from global namespace > 6) Calls to qualified functions are resolved at run-time. > Call to "A::B::foo()" first tries to call function foo() from > namespace "A::B", then it tries to find class "A::B > (__autoload() it if necessary) and call its static function foo() > 7) qualified class names are interpreted as class from > corresponding namespace. So "new A::B::C()" creates class "C" > from namespace "A::B". > > Thanks. Dmitry. > -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php