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] larue...@php.net 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] larue...@php.net 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