php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #74558 Can't rebind closure which returns by Closure::fromCallable()
Submitted: 2017-05-08 20:45 UTC Modified: 2017-05-08 21:35 UTC
From: igorchernin at yahoo dot com Assigned:
Status: Open Package: *General Issues
PHP Version: 7.1.4 OS: Windows
Private report: No CVE-ID: None
Have you experienced this issue?
Rate the importance of this bug to you:

 [2017-05-08 20:45 UTC] igorchernin at yahoo dot com
Description:
------------
---
From manual page: http://www.php.net/closure.fromcallable
---
Get error:  Cannot rebind scope of closure created by ReflectionFunctionAbstract::getClosure()

I am getting the error after converting function to Closure and after rebind the Closure to some object.
I can't bind (and also bindTo) closure which returned by Closure::fromCallable(). 


Test script:
---------------
<?php
class A {
    private $name;
    public function __construct($name)
    {
        $this->name = $name;
    }
}

// test callable
function getName()
{
    return $this->name;
}
$bob = new A("Bob");

$cl1 = Closure::fromCallable("getName");
$cl1 = $cl1->bindTo($bob, 'A');
$result = $cl1();
echo $result

Expected result:
----------------
Bob

Actual result:
--------------
Warning: Cannot rebind scope of closure created by ReflectionFunctionAbstract::getClosure() on line 18

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2017-05-08 20:52 UTC] nikic@php.net
The error message should be changed to not mention ReflectionFunctionAbstract::getClosure(), but otherwise the behavior is intentional. Freestanding functions don't have an object scope, so you cannot bind one.
 [2017-05-08 21:35 UTC] igorchernin at yahoo dot com
Thank you, for the clarification. So as I undestood. 
If I use the Closure
$cl2 = function () {
    return $this->name;
};
It has an object scope (because $cl2 is an object of Closure).
But Closure::fromCallable() creates a Closure from current scope which is not an object scope in case of freestanding function. And $this inside freestanding function is not valuable. Maybe it makes sense to add the information to manual or restrict to use $this inside freestanding functions. Thank you.
 
PHP Copyright © 2001-2019 The PHP Group
All rights reserved.
Last updated: Fri May 24 22:01:26 2019 UTC