Re: reference caller object
| From: | Richard Quadling | 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