diff options
author | Nikita Popov <nikic@php.net> | 2015-05-06 17:29:05 +0200 |
---|---|---|
committer | Nikita Popov <nikic@php.net> | 2015-05-06 17:29:05 +0200 |
commit | bc2ff4a299a182c4ab9681fa6ba52cf747f53ace (patch) | |
tree | e92e4a997fb6a2a5a3818251873b49121affcb7e /Zend | |
parent | d1363e30fdd03431c7768aa2a4b7361bf07f42fd (diff) | |
download | php-git-bc2ff4a299a182c4ab9681fa6ba52cf747f53ace.tar.gz |
Don't implicitly make closures in static methods static
It makes no sense that you can't write a closure using $this in a
static method, even though you can write one outside a class.
Now only closures that have been marked as static will be considered
to be static.
Fixes bug #65598.
Diffstat (limited to 'Zend')
-rw-r--r-- | Zend/tests/closure_041.phpt | 6 | ||||
-rw-r--r-- | Zend/tests/closure_045.phpt | 9 | ||||
-rw-r--r-- | Zend/tests/closure_046.phpt | 4 | ||||
-rw-r--r-- | Zend/zend_closures.c | 7 |
4 files changed, 9 insertions, 17 deletions
diff --git a/Zend/tests/closure_041.phpt b/Zend/tests/closure_041.phpt index 79cf9f3380..947517b4ed 100644 --- a/Zend/tests/closure_041.phpt +++ b/Zend/tests/closure_041.phpt @@ -49,7 +49,7 @@ $d = $staticUnscoped->bindTo(null); $d(); echo "\n"; $d = $nonstaticUnscoped->bindTo(null); $d(); echo "\n"; $d = $staticScoped->bindTo(null); $d(); echo "\n"; $d = $nonstaticScoped->bindTo(null); $d(); echo "\n"; -//$d should have been turned to static +// $d is still non-static $d->bindTo($d); echo "After binding, with same-class instance for the bound ones", "\n"; @@ -83,8 +83,6 @@ scoped to A: bool(true) bound: no scoped to A: bool(true) bound: no - -Warning: Cannot bind an instance to a static closure in %s on line %d After binding, with same-class instance for the bound ones Warning: Cannot bind an instance to a static closure in %s on line %d @@ -103,4 +101,4 @@ scoped to A: bool(false) bound: B (should be scoped to dummy class) scoped to A: bool(true) bound: B -Done.
\ No newline at end of file +Done. diff --git a/Zend/tests/closure_045.phpt b/Zend/tests/closure_045.phpt index 4115691761..c6276be47b 100644 --- a/Zend/tests/closure_045.phpt +++ b/Zend/tests/closure_045.phpt @@ -1,12 +1,12 @@ --TEST-- -Closure 045: Closures created in static methods are static, even without the keyword +Closure 045: Closures created in static methods are not implicitly static --FILE-- <?php class A { -static function foo() { - return function () {}; -} + static function foo() { + return function () {}; + } } $a = A::foo(); @@ -15,5 +15,4 @@ $a->bindTo(new A); echo "Done.\n"; --EXPECTF-- -Warning: Cannot bind an instance to a static closure in %s on line %d Done. diff --git a/Zend/tests/closure_046.phpt b/Zend/tests/closure_046.phpt index 30a9d3e1b1..2985e6a8db 100644 --- a/Zend/tests/closure_046.phpt +++ b/Zend/tests/closure_046.phpt @@ -27,7 +27,7 @@ $nonstaticScoped(); echo "\n"; echo "After binding, no instance", "\n"; $d = $nonstaticUnscoped->bindTo(null, "static"); $d(); echo "\n"; $d = $nonstaticScoped->bindTo(null, "static"); $d(); echo "\n"; -//$d should have been turned to static +// $d is still non-static $d->bindTo($d); echo "After binding, with same-class instance for the bound one", "\n"; @@ -54,8 +54,6 @@ bool(false) bool(true) bool(false) - -Warning: Cannot bind an instance to a static closure in %s on line %d After binding, with same-class instance for the bound one bool(false) bool(true) diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c index 97f0cbf57a..ec63f48884 100644 --- a/Zend/zend_closures.c +++ b/Zend/zend_closures.c @@ -513,17 +513,14 @@ ZEND_API void zend_create_closure(zval *res, zend_function *func, zend_class_ent } ZVAL_UNDEF(&closure->this_ptr); - /* Invariants: - * If the closure is unscoped, it has no bound object. - * The the closure is scoped, it's either static or it's bound */ + /* Invariant: + * If the closure is unscoped or static, it has no bound object. */ closure->func.common.scope = scope; closure->called_scope = called_scope; if (scope) { closure->func.common.fn_flags |= ZEND_ACC_PUBLIC; if (this_ptr && Z_TYPE_P(this_ptr) == IS_OBJECT && (closure->func.common.fn_flags & ZEND_ACC_STATIC) == 0) { ZVAL_COPY(&closure->this_ptr, this_ptr); - } else { - closure->func.common.fn_flags |= ZEND_ACC_STATIC; } } } |