Bug #68792 [Dup]: Can't declare closure using $this within static method (context)
| From: | llmll at gmx dot de | Date: | Sat, 10 Jan 2015 23:08:00 +0000 |
| Subject: | Bug #68792 [Dup]: Can't declare closure using $this within static method (context) | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-189875@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=68792&edit=1
ID: 68792
User updated by: llmll at gmx dot de
Reported by: llmll at gmx dot de
Summary: Can't declare closure using $this within static
method (context)
Status: Duplicate
Type: Bug
Package: Scripting Engine problem
Operating System: any
PHP Version: 5.5.20
Block user comment: N
Private report: N
New Comment:
Thanks for your attention. However, the warning is wrong, since the closure is *not* static. It is
merely defined in a static method. This shouldn't trigger the warning. The containing element
should not have any impact on the closure itself.
Removing the "static" keyword from the enclosing method, makes it work. Adding static,
produces the error again. This is clearly incosistent und unexpected, besides it is not documented.
class Test {
public /*static*/ function start() {
$closure = function() {
echo $this->foo;
};
$object = new \StdClass;
$object->foo = "Hello World";
$closure->bindTo($object)->__invoke();
}
}
(new Test)->start();
Previous Comments:
------------------------------------------------------------------------
[2015-01-10 23:00:11] requinix@php.net
You missed out on a warning
Warning: Cannot bind an instance to a static closure in...
making this a duplicate of bug #64761.
------------------------------------------------------------------------
[2015-01-10 17:43:13] llmll at gmx dot de
Description:
------------
The problem arises, when you try to declare a Closure (anonymous function) from within a static
method. The compiler breaks on the $this keyword which must not occur in a static method. However,
$this is only used in the closure body and should be ignored, therfore.
Test script:
---------------
class Test {
public static function start() {
$closure = function() {
echo $this->foo;
};
$object = new \StdClass;
$object->foo = "Hello World";
$closure->bindTo($object)->__invoke();
}
}
Test::start();
Expected result:
----------------
should echo "Hello World"
Actual result:
--------------
Fatal error: Using $this when not in object context
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=68792&edit=1