Edit report at https://bugs.php.net/bug.php?id=68792&edit=1
ID: 68792
Updated by: nikic@php.net
Reported by: llmll at gmx dot de
Summary: Can't declare closure using $this within static
method (context)
-Status: Assigned
+Status: Closed
Type: Bug
Package: Scripting Engine problem
Operating System: any
PHP Version: 5.5.20
Assigned To: nikic
Block user comment: N
Private report: N
New Comment:
This will be supported in PHP 7.
Previous Comments:
------------------------------------------------------------------------
[2015-01-13 07:46:51] llmll at gmx dot de
Don't take it personal. I will try to present the facts for why your patch fixes the right
thing the wrong way.
static:: implements late static binding, so it always returns the class name of where it is
referenced - regardless of the calling context, whether it is from an instance A$->foo() or a
class method A::foo().
class A {
public function foo() {
echo static::class;
}
}
class B extends A {}
B::foo(); //prints "B"
(new B)->foo(); // prints "B"
Your patch obviously fixed the late static binding problem for closures. But it introduced a wrong
behaviour by misinterpreting the static keyword from the containing method. It should work without
inspecting it.
------------------------------------------------------------------------
[2015-01-13 02:52:44] levim@php.net
> I really mean no offense, but this fix of yours is against all practical logic.
This is still being hostile; please stop.
As for static closures: they already existed. A static closure in PHP means that you don't
capture the $this context. Again, I did not add this feature.
> What could ever be the reason to make a closure depend on the declaring context?
Look at this case (http://3v4l.org/105nh):
<?php
class A {
static function foo() {
$f = function() {
return static::class;
};
return $f();
}
}
class B extends A {}
var_dump(B::foo());
?>
Before I patched it the result was string(1) "A" instead of string(1)
"B". Is this any less valid that the code you want to work? I'm not suggesting
they can't both be supported, but as it stands it how things are.
------------------------------------------------------------------------
[2015-01-12 21:57:38] llmll at gmx dot de
I really mean no offense, but this fix of yours is against all practical logic. Someone wanted
static closures? Well, closures are static by definition. Atomic, independent pieces of code which
can run in any context, thats the whole point of having closures.
Convieniently, PHP allows to bind a closure to some object instance during runtime, which simplifies
the use of $this. static:: then should point to the executing class context if available, we know
that as late static binding.
What could ever be the reaseon to make a closure depend on the declaring context? That really gives
me gray hair. I humbly think this is absolutely wrong and should be re-fixed. However, thank you for
reading and spending thoughts on this matter.
------------------------------------------------------------------------
[2015-01-12 21:31:14] levim@php.net
> I really begin to wonder if you ever accept something is wrong, bogus, inconsistent or simply
> stupid.
You are being hostile. I am the person who made closures in static methods implicitly static as
well, and I did so because of a bug report. So yes, I do accept things as bugs. Please be less
accusatory in the future.
------------------------------------------------------------------------
[2015-01-12 16:00:26] llmll at gmx dot de
You have to try the second example from my comment. There is a working snippet. Re-enable the
commented "static" and it fails. That must not happen, as the static only tags the
enclosing method, not the closure itself.
I really begin to wonder if you ever accept something is wrong, bogus, inconsistent or simply
stupid. Claiming that a clear bug happens the same way as last year doesn't make it any better
for anybody.
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
https://bugs.php.net/bug.php?id=68792
--
Edit this bug report at https://bugs.php.net/bug.php?id=68792&edit=1