Re: reference caller object

From: Date: Thu, 17 Sep 2009 09:09:52 +0000
Subject: Re: reference caller object
References: 1 2 3  Groups: php.internals 
Request: Send a blank email to internals+get-45583@lists.php.net to get a copy of this message
2009/9/17 Chris Trahey <ctrahey@csisd.org>: > It seems worthwhile in a service-provider situation where you do not wish to > enforce use of $this in service consumers. > The service provider can impliment caller without modifying existing code.. > > Semantically, it should be considered redundant to pass $this in a method > call. There should be an implicit way for a message recipient to determine > who is sending the message, in a uniform way (not left up to the consumers > of your API to impliment). > > Thanks for your consideration. > > Chris Trahey > Sent from my iPhone > > On Sep 16, 2009, at 8:47 PM, Larry Garfield <larry@garfieldtech.com> wrote: > >> If the object needs to behave differently based on who called it, there's >> already a very easy way to do that: >> >> class A { >>  function foo() { >>   $b = new B(); >>   $b->bar($this); >>  } >> } >> >> class B { >>  function bar($caller) { >>   if ($caller instance of A) { >>      // .. >>   } >>  } >> } >> >> That's also therefore much more self-documenting and easier to test >> (because >> you can simulate what gets passed in) than a magic keyword.  I don't see a >> need for new magic constants here. >> >> On Wednesday 16 September 2009 3:59:16 pm Chris Trahey wrote: >> > (Please direct me elsewhere if necessary, this is a feature request) >> > >> > It would be handy to allow a method to behave differently based on who >> > is >> > calling it. >> > the function I am looking for would essentially do this: >> > >> > function getCaller(){ >> >       $bt = debug_backtrace(); >> >       return $bt[2]['object']; >> > } >> > But of course, there is a lot of uneccessary processing with that call.. >> > Perhaps it could be implimented similar to "self" and "parent" >> > (actualy >> > more like "static") keywords. >> > >> > So you could do: >> > public function registerMe() { >> >       if( ! (caller instanceof 'my_interface')) throw new >> > dev_execption(); >> >       if( ! ($this->authenticateMod(caller))) throw new >> > admin_exception('module >> > not active'); >> >       $this->loadedMods[caller->module_id()] = caller; >> >       return caller->onLoad(); >> > } >> > >> > Chris Trahey >> > Web Applications Developer >> > Database Administrator >> > CSISD [Technology] >> >> -- >> Larry Garfield >> larry@garfieldtech.com >> >> -- > Isn't this exactly what the backtrace is for? -- ----- Richard Quadling "Standing on the shoulders of some very clever giants!" EE : http://www.experts-exchange.com/M_248814.html Zend Certified Engineer : http://zend.com/zce.php?c=ZEND002498&r=213474731 ZOPA : http://uk.zopa.com/member/RQuadling

« previous php.internals (#45583) next »