Edit report at https://bugs.php.net/bug.php?id=64761&edit=1
ID: 64761
Comment by: wanwizard at fuelphp dot com
Reported by: netmosfera at gmail dot com
Summary: rebinding of closures doesn't work when they are
declared in a static method
Status: Wont fix
Type: Bug
Package: *General Issues
Operating System: any
PHP Version: 5.5.0beta4
Block user comment: N
Private report: N
New Comment:
I understand the issue of scope here, but imho the location of where the
closure is not relevant. You get the same error when you do:
public static function somemethod()
{
// construct the a new object
$instance = static::factory();
// get the current event object
$event = \Event::getInstance();
// setup a shutdown event
$event->on('shutdown', function($event) { $this->process(); }, $instance);
}
where the "on" method is trying to bind $instance (which is an object, so there
should be no issue, $this is defined), but fails with this same error.
Previous Comments:
------------------------------------------------------------------------
[2013-05-04 05:07:03] [email protected]
as I saw, it's by design, and there are some test scripts about that:
https://github.com/php/php-src/blame/master/Zend/zend_closures.c#L499
btw, why should I trun to ircmaxell? he is the author of this?
------------------------------------------------------------------------
[2013-05-03 23:52:51] hanskrentel at yahoo dot de
@laruence: This is not by design. Please take a second look on this report.
Thank
you. You probably want to summon ircmaxell for help.
------------------------------------------------------------------------
[2013-05-03 23:44:25] netmosfera at gmail dot com
makes no sense to me!
also in the global scope $this isn't available, but rebind does work!
------------------------------------------------------------------------
[2013-05-03 15:28:02] [email protected]
it's by design.
if you create a closure within a "scope", then the function actually is a
"METHOD", thus must be bound to current object(this) or static.
for your example, since the closure is create in a static function blah, which
makes no "this" avaliable while creating closure, then the closure is created
as
static ..
------------------------------------------------------------------------
[2013-05-02 13:39:28] netmosfera at gmail dot com
Description:
------------
<?
class Test
{
public $clos;
public $bobo = 22;
static function blah(){
return new static(function(){ echo $this->bobo; });
}
function __construct(\Closure $c)
{
$this->clos = $c->bindTo($this, $this);
}
}
// perfectly fine when closure is declared in global space
$a = new Test(function(){ echo $this->bobo; });
$clos = $a->clos;
$clos();
// binding doesn't work when closure is declared in a static method
$a = Test::blah();
$clos = $a->clos;
$clos();
// results in: Warning: Cannot bind an instance to a static closure
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=64761&edit=1