summaryrefslogtreecommitdiff
path: root/Zend
diff options
context:
space:
mode:
Diffstat (limited to 'Zend')
-rw-r--r--Zend/tests/bug42211.phpt30
-rw-r--r--Zend/zend_builtin_functions.c3
2 files changed, 32 insertions, 1 deletions
diff --git a/Zend/tests/bug42211.phpt b/Zend/tests/bug42211.phpt
new file mode 100644
index 0000000000..e9f2a1e212
--- /dev/null
+++ b/Zend/tests/bug42211.phpt
@@ -0,0 +1,30 @@
+--TEST--
+Bug #42211 (property_exists() fails to find protected properties from a parent class)
+--FILE--
+<?php
+class A {
+ function foo() {
+ var_dump(property_exists('B', 'publicBar'));
+ var_dump(property_exists('B', 'protectedBar'));
+ var_dump(property_exists('B', 'privateBar'));
+ }
+}
+
+class B extends A {
+ static public $publicBar = "ok";
+ static protected $protectedBar = "ok";
+ static private $privateBar = "fail";
+}
+
+$a = new A();
+$a->foo();
+$b = new B();
+$b->foo();
+--EXPECT--
+bool(true)
+bool(false)
+bool(false)
+bool(true)
+bool(true)
+bool(false)
+
diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c
index 0f4cf86b20..7b036edfff 100644
--- a/Zend/zend_builtin_functions.c
+++ b/Zend/zend_builtin_functions.c
@@ -979,7 +979,8 @@ ZEND_FUNCTION(property_exists)
}
zend_unmangle_property_name(property_info->name, property_info->name_length, &class_name, &prop_name);
if (!strncmp(class_name, "*", 1)) {
- if (instanceof_function(EG(scope), ce TSRMLS_CC)) {
+ if (instanceof_function(EG(scope), ce TSRMLS_CC) ||
+ (EG(This) && instanceof_function(Z_OBJCE_P(EG(This)), ce TSRMLS_CC))) {
RETURN_TRUE;
}
RETURN_FALSE;