2015-02-01 0:10 GMT+02:00 Rowan Collins <rowan.coll...@gmail.com>:
> On 31/01/2015 19:41, S.A.N wrote:
>>
>> No, I'm not describing this behavior, but I chose the wrong name
>> keyword, this is not perceived correctly.
>>
>> My source code examples, it is clear that no returns previous object
>> from the call stack, me need return references to the holder object.
>>
>> It's more like the dynamic of "this" in JavaScript.
>> Dynamic "this", sometimes very convenient for the event model, so I
>> proposed to implement this feature in PHP.
>> In PHP, there traits, extends, but it's all static bind, in runtime
>> can not be added or redefined.
>>
>> I'll show a simple JS example, in which needed behavior dynamic this.
>> <script language="JavaScript">
>>
>> function A(){}
>> function B(){}
>>
>> function getHolder()
>> {
>>      console.log(this.constructor.name)
>> }
>>
>> var oA = new A
>> var oB = new B
>>
>> oA.getHolder = getHolder
>> oB.getHolder = getHolder
>>
>> oA.getHolder() // return A
>> oB.getHolder() // return B
>>
>> getHolder() // return Window
>>
>> </script>
>>
>> Perhaps we should use the keyword "this" instead of "caller"? :)
>> Then the code in PHP will look like this:
>>
>> <?php
>>
>> class A
>> {
>>      public $object;
>> }
>>
>> class B
>> {
>>      public $object;
>> }
>>
>> class C
>> {
>>      public function getHolder() {
>>          return this::class;
>>      }
>> }
>>
>> $a = new A;
>> $b = new B;
>> $c = new C;
>>
>> $a->object = $c;
>> $b->object = $c;
>>
>> $a->object->getHolder(); // return A
>> $b->object->getHolder(); // return B
>>
>> $c->getHolder(); // Fatal Error - undefined context
>>
>> ?>
>>
>> What do you think?
>> Thank.
>>
>
> Hi,
>
> I think I get what you're trying to do, but I'm not sure the PHP code you
> suggest is quite equivalent to the JavaScript. In JavaScript, you are
> setting a single function (getHolder) as a direct member of your objects:
>
> oA.getHolder = getHolder
> oB.getHolder = getHolder
>
> But in the PHP, you are attaching a whole object to a property:
>
> $a->object = $c;
> $b->object = $c;
>
> When you call getHolder in PHP, the "holder" of that method is always $c,
> because you could split the code up like this:
>
> $something = $a->object;
> $something->getHolder();
>
> In general, a method can't be copied from one object to another in PHP like
> it can in JS, so the concept of dynamic this doesn't normally make any
> sense. However, you can do something similar by "binding a closure"; you
> just need to invoke it a bit differently because properties and methods are
> not interchangeable like they are in JS:
>
> <?php
>
> class A {
>     public $getHolder;
> }
> class B {
>     public $getHolder;
> }
>
> $getHolderDefinition = function() { return get_class($this); };
>
> $a = new A;
> $b = new B;
>
> $a->getHolder = $getHolderDefinition->bindTo($a);
> $b->getHolder = $getHolderDefinition->bindTo($b);
>
> echo $a->getHolder->__invoke(), "\n";
> echo $b->getHolder->__invoke(), "\n";
>
> // Or
>
> $method = $a->getHolder;
> echo $method(), "\n";
>
> $method = $b->getHolder;
> echo $method(), "\n";
>
>
>
> For many callback / event scenarios, you don't actually need to treat the
> closure as a property / method of the object at all, you just want the $this
> reference, so the ->bindTo() part is all you need, maybe more like this:
>
> class SomeEventTarget {
>     function triggerEvent($someCallback) {
>         $boundCallback = $someCallback->bindTo($this);
>         $boundCallback($some, $arguments);
>     }
> }
>
> (PS: The house rules for this list asks for replies to be below quoted text,
> not above.)
>
> Regards,
>
> --
> Rowan Collins
> [IMSoP]
>
>
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
>

Yes, you're right, in PHP you can solve this problem by other methods, I know...

But the problem is that PHP is no nice and convenient for solving this problem.
So I suggested to add new keyword, not to do manually bindTo($this)
for each methods.

Thank.

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

Reply via email to