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

Reply via email to