summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS2
-rw-r--r--Zend/tests/bug77877.phpt23
-rw-r--r--Zend/zend_API.c4
3 files changed, 29 insertions, 0 deletions
diff --git a/NEWS b/NEWS
index 178b551273..faa1c164b4 100644
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,8 @@ PHP NEWS
- Core:
. Fixed bug #77345 (Stack Overflow caused by circular reference in garbage
collection). (Alexandru Patranescu, Nikita, Dmitry)
+ . Fixed bug #77877 (call_user_func() passes $this to satatic methods).
+ (Dmitry)
. Implemented request #76148 (Add array_key_exists() to the list of
specially compiled functions). (Majkl578)
. Fixed bug #76430 (__METHOD__ inconsistent outside of method).
diff --git a/Zend/tests/bug77877.phpt b/Zend/tests/bug77877.phpt
new file mode 100644
index 0000000000..9e0181e1a6
--- /dev/null
+++ b/Zend/tests/bug77877.phpt
@@ -0,0 +1,23 @@
+--TEST--
+Bug #77877 call_user_func() passes $this to satatic methods
+--FILE--
+<?php
+class Foo {
+ static public function bar() {
+ var_dump($this);
+ }
+}
+try {
+ array_map([new Foo, 'bar'],[1]);
+} catch (Throwable $e) {
+ echo $e->getMessage() . "\n";
+}
+try {
+ call_user_func([new Foo, 'bar']);
+} catch (Throwable $e) {
+ echo $e->getMessage() . "\n";
+}
+?>
+--EXPECT--
+Using $this when not in object context
+Using $this when not in object context
diff --git a/Zend/zend_API.c b/Zend/zend_API.c
index 881ee27a03..20b5fbb3b4 100644
--- a/Zend/zend_API.c
+++ b/Zend/zend_API.c
@@ -3170,6 +3170,10 @@ get_function_via_handler:
if (fcc->object) {
fcc->called_scope = fcc->object->ce;
+ if (fcc->function_handler
+ && fcc->function_handler->common.fn_flags & ZEND_ACC_STATIC) {
+ fcc->object = NULL;
+ }
}
return retval;
}