--- /dev/null
+--TEST--
+Bug #41961 (Ensure search for hidden private methods does not stray from class hierarchy)
+--FILE--
+<?php
+X::test();
+
+/** Class X is related to neither ParentClass nor ChildClass. */
+class X {
+ public static function test() {
+ $myChild = new ChildClass;
+ $myChild->secret(); // bug - invokes X::secret() instead of ChildClass::secret()
+ }
+ private function secret() {
+ echo "Called private " . __METHOD__ . "() on an instance of: " . get_class($this) . "\n";
+ }
+}
+
+class ParentClass {
+ private function secret() { }
+}
+
+class ChildClass extends ParentClass {
+ public function secret() {
+ echo "Called public " . __METHOD__ . "() on an instance of: " . get_class($this) . "\n";
+ }
+}
+?>
+--EXPECT--
+Called public ChildClass::secret() on an instance of: ChildClass
/* Ensure that we haven't overridden a private function and end up calling
* the overriding public function...
*/
- if (EG(scope) && fbc->op_array.fn_flags & ZEND_ACC_CHANGED) {
+ if (EG(scope) &&
+ is_derived_class(fbc->common.scope, EG(scope)) &&
+ fbc->op_array.fn_flags & ZEND_ACC_CHANGED) {
zend_function *priv_fbc;
if (zend_u_hash_find(&EG(scope)->function_table, type, lc_method_name, lc_method_name_len+1, (void **) &priv_fbc)==SUCCESS