I agree with Yasuo - these functions put a de-facto functionality standard in a highly debated topic that has not yet reached consensus - the least we could do is point out to people that it may very well change in the future...
Zeev At 04:40 AM 4/5/2002, Yasuo Ohgaki wrote: >--disable-experimental-aggregate and >--disable-experimental-overload? > >Just in case we really want to make it optional and have new way >for overloading/multiple inheritance. >We can document these features as EXPETIMENTAL as long as we want, >right? > >-- >Yasuo Ohgaki > > >Kristian Koehntopp wrote: >>I have several observations regarding the newly implemented >>aggregate() und overload() extensions. Depending on the >>correctness of these observations you may want to reconsider the >>inclusion of these extensions in the current build of PHP. >>The following has not in its entirety verified in the source and >>may be incorrect or incomplete. Please correct me. >>Situation: >>$obj = new Origclass; aggregate($obj, "Classname"); is a >>function which adds all instance variables and methods from >>class Classname to an object $obj of an original class >>Origclass. There are variations of aggregate which allow you to >>add instance variables and methods selectively by enumeration >>and regex. >>Observation: >>aggreate and friends break the introspection in PHP, and may >>interfere with serialization and sessions. This is, because >>get_class($obj) returns Origclass, and no trace of Classname. >>Also, $obj is_a() Origclass, but not is_a(Classname), leading to >>serialization of $obj as a pure Origclass, and reinstantiation >>as a pure Origclass with no methods from Classname at all. >>This is the situation of serialize() in PHP 3 at a slightly >>elevated level. Reminder: In PHP 3, serialize() did not record >>the class of an object on serialization, and unserialize() >>consequently produced an object with no methods at all, which is >>in fact quite useless. >>Also, because of the fine grained nature of the more advanced >>variations of aggregate, there is no fast way to describe the >>class or type of an object instance. The only way to completely >>describe an object is to completely enumerate its instance >>variables and instance methods. Essentially, get_class and >>friends become meaningless. >>Alternative: >>aggregate is a badly designed way to introduce multiple >>inheritance like functionality. There are at least two tested >>ways to implement MI functionality. Statically typed languages >>such as C++ set type == class and implement pure MI. Regarding >>PHP, this would lead to >>class C extends A, B { ... } >>with the order of A and B being important. Also, >>get_parent_class() would need to be modified to return >>inheritance level information or inheritance graph information >>together with class names in order to produce meaningful >>information. Something like >> $v = get_parent_class($complicated_object); >>$v would be >> array("A" => "B", "B" => "C", "B" => "D"); >>for >> class A extends B ... >> class B extends C, D ... >>An alternative, possibly cleaner way would be the introduction >>of interfaces and categories. In this scenario we keep single >>inheritance. We introduce declarations of interfaces, which may >>contain a number of instance variables and functions. Interfaces >>are a simple declaration of these, there is no implementation at >>all in an interface. >>A class may claim conformity with an interface. This means that >>the class at least has all the instance variables the interface >>demands and has at least implementations for all member >>functions of the interface. The class may implement all this >>independently or it may import a category. >>A category is class-subset, and always an implementation of an >>interface (you cannot define a category for which no interface >>definition is being known). >>Interfaces and Categories are found in some dynamically typed >>languages, sometimes under slightly different names. They >>separate type and class, and in order for them to function in >>PHP we would need enumerative functions and predicates to >>complement the new language constructs (get_defined_interfaces(), >>get_defined_categories(), conforms_to($interface_name)). >>Recommendation: >>As-is aggregate() is a broken design, and will break existing >>older functionality. It will create a number of support issues, >>and later backward compatibility issues. It may inspire even >>more broken "fixes" for these issues, effectively uglifying the >>language itself or at least its object system. >>The best would be to remove aggregate() completely, and bury it. >>It should be replaced by a proper MI system, probably one for a >>dynamically typed language, as PHP is such a language. >>If aggregate() functionality is being used right now, and is >>critical, it should be kept, properly documented, the drawbacks >>spelled out in all its ugliness and its use strongly >>discouraged. It should be clearly marked as obsolete from day 1, >>and may be removed at any time. If someone uses this feature >>despite the warning labels, this person deserves everything that >>happens. >> >>Situation: >>The overload() extension allows userland code to intercept get, >>set and call operations on the instance variables and instance >>functions of an object. It does this by defining the special >>fixed name functions __get, __set and __call in a class, which >>are enabled by calling overload() on this class. >>It also allows, according to Sebastian Bergmann, and in spite of >>the current documentation at >>http://www.php.net/ref.overload.php, __get_x(), __set_y() and >>__call_x() functions in order to intercept accesses and calls to >>instance variable x and method y respectively. >>I haven't verified this in source, but Sebastian claims it >>works. >>Observation: >>If this is NOT the case, I have no issue with overload(). It is >>dangoerous, but it is an expert feature and the design is okay. >>If overload() allows for __get_x(), though, this is bad design. >>The reason for this is that we get namespace pollution and, >>again (*), automatically called callback functions with a >>variable name. There will interoperate badly with inheritance, >>with dynamically created, undeclared instance variables and with >>aggregate(). >>Recommendation: >>If overload() indeed supports variably named callback functions >>such as __get_x(), support for this should be removed in order >>to avoid a number of possible inconsistencies and namespace >>pollution. >> >>End Rant, fire away... >> Kristian >>(*) We had them with PHP 3 constructor names, which were an >> extremely bad idea in the first place. > > > >-- >PHP Development Mailing List <http://www.php.net/> >To unsubscribe, visit: http://www.php.net/unsub.php -- PHP Development Mailing List <http://www.php.net/> To unsubscribe, visit: http://www.php.net/unsub.php