This sounds awesome. Good job, Jessie. Keep it up! - David
> -----Original Message----- > From: Jessie Hernandez [mailto:[EMAIL PROTECTED] > Sent: Tuesday, August 02, 2005 6:07 AM > To: internals@lists.php.net > Subject: [PHP-DEV] [PATCH] Namespace Patch, Beta 1 > > Attached is the latest version of the namespace patch! It finally includes > namespace imports and it even includes anonymous namespace support. Also, > the previous bison shift/reduce conflict has been removed. Here is a > summary of its features: > > - Simple imports: import ns:class1; > - Import aliases: import ns:class1 as my_alias; > - Namespace imports: import namespace ns; > - Anonymous namespaces: namespace { class file_class{} } > - Namespace-private classes: namespace ns{ private class prv_class{} } > > Two new functions have also been added to support namespace imports (more > on > that below): > > - get_imported_namespaces([$className]) > Returns an array of imported namespaces for the current file. If a class > name is passed, and this class is currently being autoloaded (also meaning > that this function is called inside __autoload), then the list of returned > imported namespaces is based on the file that triggered the __autoload > call. > > - autoload_import_class($className, $namespaceName) > Imports a class in a given namespace for the currently executing file (can > ONLY be used inside __autoload!) > > Imports > ------- > Imports and namespace imports are handled completely by the user with the > use of the __autloload function. This means that there are no restrictions > on class file naming/directory structure. For simple imports, the class > name will be passed with its full name (including the colons, such as > "ns:class1"). For namespace imports, only the class name will be called. > Since the user needs to determine which namespace (or namespaces) a class > belongs to, the "get_imported_namespaces" function is provided to check > the > imported namespaces for the currently-executing file. Once the user is > satisfied with a match, he/she needs to perform an "import" for this > class, > but this needs to be done on the executing file, not the file where > __autoload is defined. For this reason, the autoload_import_class function > is provided. A sample usage of both these functions is at > tests/classes/namespace_autoload.php. > > Namespace-private classes > ------------------------- > Classes marked as "private" from within a namespace can only be used by > classes defined in the same namespace. > > Anonymous namespaces > -------------------- > Classes defined inside anonymous namespaces can only be used within the > file > that declared the anonymous namespace. > > > I believe the attached patch solves the issues that were presented long > ago > for namespaces. Referring to the post by Daniel Cogwill at > http://www.zend.com/lists/engine2/200304/msg00164.html, the following are > my answers to the problems he found at the time: > > 1) import-all silently hides local names. > A: If a global class is defined with the same name as a class in a > namespace, and the namespace class has been imported in the same script, > the global class takes precedence. The namespace class can still be used > by > using its full name, i.e. namespace_name:class_name. > > 2) Interestingly (and I assume this is simply a bug), functions and > classes > behave differently wrt to import-all and duplicate definitions. > A: Irrelevant in this patch. > > 3) There is no way to hide names from import (i.e. make a name > non-exportable). This is a fundamental namespace feature, and there is > already an appropriate keyword (private). > A: Namespace-private classes are supported, using the "private" keyword. > > 4) The semantic meaning of successive imports depends on their relative > ordering. > A: The engine does not attempt to determine which class is included, the > user decides the most appropriate behavior inside __autoload. > > 5) The most egregious issue is that an import in an included file affects > the scope of the including file. > A: Imports in this patch only affect the file they are in. > > > Since I could not find a way to add the tests/classes/namespace directory > and subdirectories, I zipped them separately, as before. > > Let me know if you have any questions on the attached patch. > > > Best regards, > > Jessie Hernandez > -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php