diff --git a/Zend/tests/bug66719.phpt b/Zend/tests/bug66719.phpt new file mode 100644 index 00000000000..70785b4a784 --- /dev/null +++ b/Zend/tests/bug66719.phpt @@ -0,0 +1,43 @@ +--TEST-- +Bug #66719: Weird behaviour when using get_called_class() with call_user_func() +--FILE-- + +--EXPECT-- +string(1) "B" +string(1) "A" +string(1) "A" +string(1) "B" +string(1) "A" +string(1) "A" diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 2cf2a955a58..e1caef913eb 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3326,6 +3326,9 @@ static bool zend_is_callable_check_class(zend_string *name, zend_class_entry *sc if (error) *error = estrdup("cannot access \"self\" when no class scope is active"); } else { fcc->called_scope = zend_get_called_scope(frame); + if (!fcc->called_scope || !instanceof_function(fcc->called_scope, scope)) { + fcc->called_scope = scope; + } fcc->calling_scope = scope; if (!fcc->object) { fcc->object = zend_get_this_object(frame); @@ -3339,6 +3342,9 @@ static bool zend_is_callable_check_class(zend_string *name, zend_class_entry *sc if (error) *error = estrdup("cannot access \"parent\" when current class scope has no parent"); } else { fcc->called_scope = zend_get_called_scope(frame); + if (!fcc->called_scope || !instanceof_function(fcc->called_scope, scope->parent)) { + fcc->called_scope = scope->parent; + } fcc->calling_scope = scope->parent; if (!fcc->object) { fcc->object = zend_get_this_object(frame);