Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:30683 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 56889 invoked by uid 1010); 9 Jul 2007 16:36:53 -0000 Delivered-To: ezmlm-scan-internals@lists.php.net Delivered-To: ezmlm-internals@lists.php.net Received: (qmail 56874 invoked from network); 9 Jul 2007 16:36:53 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 9 Jul 2007 16:36:53 -0000 Authentication-Results: pb1.pair.com header.from=dmitry@zend.com; sender-id=pass Authentication-Results: pb1.pair.com smtp.mail=dmitry@zend.com; spf=pass; sender-id=pass Received-SPF: pass (pb1.pair.com: domain zend.com designates 212.25.124.162 as permitted sender) X-PHP-List-Original-Sender: dmitry@zend.com X-Host-Fingerprint: 212.25.124.162 mail.zend.com Linux 2.5 (sometimes 2.4) (4) Received: from [212.25.124.162] ([212.25.124.162:55805] helo=mail.zend.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id DC/20-55492-12462964 for ; Mon, 09 Jul 2007 12:36:51 -0400 Received: (qmail 25612 invoked from network); 9 Jul 2007 16:36:46 -0000 Received: from internal.zend.office (HELO thinkpad) (10.1.1.1) by internal.zend.office with SMTP; 9 Jul 2007 16:36:46 -0000 To: Date: Mon, 9 Jul 2007 20:36:43 +0400 Message-ID: <000501c7c247$56a551d0$6e02a8c0@thinkpad> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook, Build 10.0.6626 Importance: Normal X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3138 Subject: FW: Simple Namespace Proposal From: dmitry@zend.com ("Dmitry Stogov") I am going to commit this patch on Wednesday. Thanks. Dmitry. > -----Original Message----- > From: Dmitry Stogov [mailto:dmitry@zend.com] > 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: > 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. > > require 'Zend/Db/Connection.php'; > $x = new Zend::DB::Connection; > Zend::DB::connect(); > ?> > > Namespace or class name can be imported: > > 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. 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. > > 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. >