No problem mate :) As a general rule, it seems that PHP just copied Java's OOP model - and outside of the quirks in the way it works internally - it's a pretty damn good implementation of object orientation. THe only issue I have with it is that it's not possible to lose the procedural bootstrapper :( On Sun, May 24, 2009 at 11:24 PM, phphelp -- kbk <phphelp@xxxxxxxxxxx>wrote: > Thanks, guys, for the discussion. This is nothing compelling for me, just > fooling around with the model. My first OOP language many-a-year ago had > this ability. "Parent" designated containment, not (as I believe, too, is > more "correct") inheritance hierarchy, like PHP. I and have never had the > need to call a "containing" function in PHP, but I was exploring the best > way to accomplish a new task the other day, and that kind of architecture > seemed like a possibility. > > In fact, probably just a bad idea. > > (I see so much of that in this list: "I need to..." followed by a > description of some bizarre construct. I want to scream "No! You have > painted yourself into a corner! Test your assumptions, or go back 5 steps > and start over.") > > Thanks again.... > > Ken > > > On May 24, 2009, at 9:38 PM, Eddie Drapkin wrote: > > That's containment, not inheritence, must have misread the email. Oops :) >> >> The "easiest" way to do this would be something like: >> >> class contrived { >> private $parent; >> private $otherparent; >> >> public function __call($func, $params) { >> if(is_callable(array($this->parent, $func)) >> call_user_func_array(array($this->parent, $func), $params) >> elseif(is_callable(array($this->otherParent, $func)) >> call_user_func_array(array($this->otherparent, $func), $params) >> } >> >> } >> >> This is the most "elegant" way to accomplish the same thing, but it makes >> some assumptions, like you're willing to chain if-elseif's together (or >> store all contained instances in an array) and that you don't ever have >> overlapping method names (ie contrived.foo and parent.foo both exist). >> Also, it's really, really obnoxiously slow. __call() is hardly fast and >> call_user_func_array is no different. >> >> On Sun, May 24, 2009 at 7:52 PM, Nathan Rixham <nrixham@xxxxxxxxx> wrote: >> Eddie Drapkin wrote: >> You can call methods from a classes's parents like so >> class foo { >> >> protected method bar() { >> echo "in foo!"; >> } >> >> } >> >> class foobar extends foo { >> >> public function bar() { >> parent::bar(); >> } >> } >> >> $fb = new foobar(); >> $fb->bar(); will output "in foo!"; >> >> >> wrong way round.. he's asking for: >> >> // note no extends >> class foobar { >> >> public function bar() { >> $this->foo = new Foo(); >> $this->foo->bar(); >> } >> >> public function poo() { >> echo "call me if you can"; >> } >> >> } >> >> // and the impossible >> class foo { >> >> public method bar() { >> foobar->poo(); // call the containing class >> } >> >> } >> >> in a dom or as3 or suchlike this would be >> >> this.parent.poo(); >> >> but we have not this->parent >> >> note: note parent::poo() which is effectively super.poo() <lol> >> >> so he can only inject the container/parent >> >> <?php >> >> class foobar { >> >> private $foo; >> >> public function bar() { >> $this->foo = new Foo( $this ); >> $this->foo->bar(); >> } >> >> public function poo() { >> echo "call me if you can"; >> } >> >> } >> >> // and the Possible >> class foo { >> >> private $parent; >> >> public function __construct( $parent ) { >> $this->parent = $parent; >> } >> >> public method bar() { >> $this->parent->poo(); // call the containing class method poo >> } >> >> } >> >> >