]> granicus.if.org Git - php/commitdiff
Fixed bug #42211 (property_exists() fails to find protected properties from a parent...
authorDmitry Stogov <dmitry@php.net>
Wed, 8 Aug 2007 13:32:46 +0000 (13:32 +0000)
committerDmitry Stogov <dmitry@php.net>
Wed, 8 Aug 2007 13:32:46 +0000 (13:32 +0000)
NEWS
Zend/tests/bug42211.phpt [new file with mode: 0644]
Zend/zend_builtin_functions.c

diff --git a/NEWS b/NEWS
index 38ed700c8ad128ec08c5105e508fc78352a94fa2..1f974e1dc8e3ac0b57211ebd59b551e91206f57c 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,8 @@ PHP                                                                        NEWS
   streams). (andrew dot minerd at sellingsource dot com, Ilia)
 - Fixed bug #42233 (Problems with æøå in extract()). (Jani)
 - Fixed bug #42222 (possible buffer overflow in php_openssl_make_REQ). (Pierre)
+- Fixed bug #42211 (property_exists() fails to find protected properties from
+  a parent class). (Dmitry)
 - Fixed bug #42208 (substr_replace() crashes when the same array is passed 
   more than once). (crrodriguez at suse dot de, Ilia)
 - Fixed bug #42198 (SCRIPT_NAME and PHP_SELF truncated when inside a userdir
diff --git a/Zend/tests/bug42211.phpt b/Zend/tests/bug42211.phpt
new file mode 100644 (file)
index 0000000..e9f2a1e
--- /dev/null
@@ -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)
+
index 0f4cf86b203315758e203ca60b2d9694969ed2f4..7b036edfffa77f5d3c2debadecfb0b3c994492b5 100644 (file)
@@ -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;