Re: [RFC] prototyping
| From: | Marcus Boerger | Date: | Mon, 19 Jan 2009 11:57:21 +0000 |
| Subject: | Re: [RFC] prototyping | ||
| References: | 1 2 3 4 5 6 7 8 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-42703@lists.php.net to get a copy of this message | ||
Hello Stanislav,
Monday, January 19, 2009, 9:32:09 AM, you wrote:
> Hi!
>> It is a mess right now. You assign a closure to another method and get
>> access to the original owners private members. That is not only unexpected
> Could you give a code example? I'm not sure I understand what you mean
> by access (or "assign closure to a method" for that matter) - if access
> provided by the closure, it's exactly the intent of the closure. If some
> other access, then please explain which one.
class Foo {
private $myVeryOwnData;
function bla {
$this->bigMEss = function () { return $this->myVeryOwnData; }
}
}
$o = new Foo;
$f = $o->bla;
echo $f();
class Bar {
function baz{} {
$this->xyz = $o->bla; // or $f;
// I am very sorry but I would expect the closure to rebind $this as
// $this always points to the bound object. And how is this different?
// If the different is that the closure is already bound and that is
// what you want, then we need ways to do just that. And not inventing
// new ways to deal with $this.
}
}
$onother = new stdClass;
$another->blabla = $f; // yet again a very unexpected $this.
If this really was to be bound to a $this at the creation, then we'd put it
into the scope binding list and not have it be handled implicitly. But then
we cannot do that with the current c level api. So instead you created
brand new rules, which unfortunately is the PHP way.
So how would I copy a closure instead of rebinding it?
I would use PHP's current established semantics for that. That is I'd do:
$this->closure = clone $closure;
$this->closure = $closure->copy();
How would I prevent automatic $this binding?
$closure = static function()....
> --
> Stanislav Malyshev, Zend Software Architect
> stas@zend.com http://www.zend.com/
> (408)253-8829 MSN: stas@zend.com
Best regards,
Marcus