Bug #74558 [PATCH]: Can't rebind closure which returns by Closure::fromCallable()
Edit report at https://bugs.php.net/bug.php?id=74558&edit=1
ID: 74558
Patch added by: cmb@php.net
Reported by: igorchernin at yahoo dot com
Summary: Can't rebind closure which returns by
Closure::fromCallable()
Status: Assigned
Type: Bug
Package: Scripting Engine problem
Operating System: Windows
PHP Version: 7.1.4
Assigned To: cmb
Block user comment: N
Private report: N
New Comment:
The following pull request has been associated:
Patch Name: Fix #74558: Can't rebind closure returned by Closure::fromCallable()
On GitHub: https://github.com/php/php-src/pull/6424
Patch: https://github.com/php/php-src/pull/6424.patch
Previous Comments:
------------------------------------------------------------------------
[2017-05-08 21:35:06] 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.
------------------------------------------------------------------------
[2017-05-08 20:52:52] 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 20:45:21] 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
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=74558&edit=1
Thread (5 messages)