Oh and to those who are just about to shout "clashes with ternary operator":
$bar = new $foo ? Foo : Bar;
doesn't work in PHP.

- David


> -----Original Message-----
> From: David Zülke [mailto:[EMAIL PROTECTED]
> Sent: Thursday, July 07, 2005 9:32 AM
> To: internals@lists.php.net
> Subject: RE: [PHP-DEV] YANP (Yet Another Namespace Proposal)
> 
> Sounds sweet. However, I already found a problem there, it has to do with
> aliasing. Lots of code (libraries) will, even inside the same class, use
> the
> class name for method calls instead of the "self" keywords for various
> reasons. This will break if the user decides to alias the class and use
> it,
> I guess. Other than that, I don't see any problems so far. Does a
> My:Nested:Namespace:Class::staticMethod() work?
> 
> Nice work man, keep it up, let's hope we can finally have some
> namespaces/packaging support in PHP ;) I wish you luck. +1 from me.
> 
> - David
> 
> P.S: check out http://article.gmane.org/gmane.comp.php.devel/29492, might
> be
> of help, dunno
> 
> 
> > -----Original Message-----
> > From: Jessie Hernandez [mailto:[EMAIL PROTECTED]
> > Sent: Thursday, July 07, 2005 2:44 AM
> > To: internals@lists.php.net
> > Subject: [PHP-DEV] YANP (Yet Another Namespace Proposal)
> >
> > I have locally made changes to support namespaces, with minimal impact
> to
> > the Zend Engine (I based my changes on PHP 5.1.0b2). I have gone through
> > the archives and read the previous discussions about namespaces and the
> > outstanding issues, and to the best of my knowledge, I think my changes
> > solve these.
> >
> > I have only a few things to finish (as I'll explain below), but so far
> > everything's working great (I have only enabled classes to be under
> > namespaces, since that's all I care about, but functions and constants
> can
> > be added in a similar manner)! Since I still have some things to finish,
> I
> > won't post a patch yet, but I'll give a high-level description of what I
> > did to see if my approach is acceptable or not.
> >
> > Basically, my approach involves the following concepts:
> >
> > - Classes may not contain colons (no change here), BUT class name
> > references
> > CAN contain colons (this is KEY!).
> > - All imports are done at compile time.
> > - Imports only affect the current file (yes, this has been done!)
> >
> > Here are some more details:
> >
> > Class Table Manipulation
> > ------------------------
> > When the start of a namespace declaration is encountered, the namespace
> > name
> > is saved in a compile global variable. All classes inside the namespace
> > block will get the namespace name and the colon prepended to the name
> > (this
> > is done in "zend_do_begin_class_declaration"). So, for the following
> code:
> >
> > <code>
> > namespace my_namespace{ class my_class{ public $mem; } }
> > </code>
> >
> > What will actually happen here is that the class will get added to the
> > class
> > table as "my_namespace:my_class".
> >
> >
> > Referencing Classes
> > -------------------
> > The following two examples are valid:
> >
> > <code>
> > $a = new my_namespace:myclass();
> > </code>
> >
> > <code>
> > import my_namespace:myclass;
> > $a = new myclass();
> > </code>
> >
> >
> > Imports
> > -------
> > The syntax for the import statement will be:
> >
> > import <full-class-name> [as <alias-name>];
> >
> > I have not yet added full namespace imports ("wildcard" imports), and am
> > not
> > yet sure if this is a good idea. Anyways, with the import statement, if
> no
> > alias is specified, then the class is imported with the remaining string
> > after the last colon in the name, and if an alias is specified, then
> that
> > name is used (aliases cannot contain colons). For example:
> >
> > <code>
> > import my_namespace:myclass;
> > $a = new myclass();
> > </code>
> >
> > <code>
> > import my_namespace:myclass as my_namespace_my_class;
> > $a = new my_namespace_myclass();
> > </code>
> >
> > When an import is done, what happens is that the import is saved in an
> > import hashtable, which holds the "aliases" which are active for the
> > current file. The alias is also saved in class_table (an additional
> entry
> > is added, the key being the alias name and the value being the
> > zend_class_entry for the actual class). This means that a
> zend_class_entry
> > can belong to more than one key in class_table at a time (this is done
> to
> > emulate that a class by that name actually exists, and it also prevents
> > classes in the global namespace to be named the same as import aliases).
> >
> > Now for the interesting part! How are imports done on a file scope only?
> > The
> > key to this is that file scopes can be emulated at compile time, but not
> > at
> > run time. As I said before, imports are saved in a compile global
> > hashtable. When the end of the file is reached, this hashtable is
> cleared
> > and the alias entries are removed from class_table. This is done simply
> by
> > modifying the start rule:
> >
> > start:
> >         top_statement_list { zend_do_unimport_all(TSRMLS_C); }
> > ;
> >
> > This triggers the "zend_do_unimport_all" function to be called at the
> end
> > of
> > the file. At this point (before the function is called), all references
> to
> > imported names have been changed internally to full class names, which
> > include the namespace and colon(s). Since include/require statements are
> > executed at runtime, when the "zend_compile_file" function is executed
> for
> > the included files, the import hashtable will be empty!
> >
> > I have not yet begun doing this, but I would like the import statement
> to
> > actually include the file where the class is defined. A new php.ini
> > variable called "class_path" will be used for this. When an "import
> > my_ns:my_class;" statement is encountered, the file
> > "<class-path>/my_ns/my_class.php" will be included (of course, multiple
> > directories can be specified in the class_path, just like include_path).
> >
> >
> > The above changes make a minimal impact to the Zend engine, and since
> all
> > the namespace/import translation is done at compile time, execution
> speed
> > is not affected.
> >
> > I would like to gather comments/suggestions/criticisms of the above
> > approach, in order to see if I should continue making these changes or
> > not.
> > If there is enough demand, I will post the patches of what I have so
> far,
> > even though it's not complete.
> >
> >
> > Regards,
> >
> > Jessie Hernandez
> >
> > --
> > PHP Internals - PHP Runtime Development Mailing List
> > To unsubscribe, visit: http://www.php.net/unsub.php
> >
> 
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
> 

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to