]> granicus.if.org Git - php/commitdiff
- Fixed bug #45743 (property_exists fails to find static protected member in child...
authorFelipe Pena <felipe@php.net>
Mon, 18 Aug 2008 17:40:14 +0000 (17:40 +0000)
committerFelipe Pena <felipe@php.net>
Mon, 18 Aug 2008 17:40:14 +0000 (17:40 +0000)
In general, now property_exists() behave like method_exists() (ie. independs of context/visibibility)

Zend/tests/011.phpt
Zend/tests/bug42211.phpt
Zend/zend_builtin_functions.c

index dd4255f71303285633703b915d0ff300d3806b49..7bcab0798fc6cb8b15af5d86635983ed308466f0 100644 (file)
@@ -59,16 +59,16 @@ NULL
 Warning: property_exists() expects exactly 2 parameters, 1 given in %s on line %d
 NULL
 bool(true)
-bool(false)
-bool(false)
+bool(true)
+bool(true)
 bool(false)
 bool(false)
 bool(false)
 bool(false)
 bool(false)
 bool(true)
-bool(false)
-bool(false)
+bool(true)
+bool(true)
 bool(false)
 bool(false)
 
@@ -84,6 +84,6 @@ bool(true)
 bool(true)
 bool(true)
 bool(true)
-bool(false)
+bool(true)
 bool(true)
 Done
index 80f6b8b00493dabc5650ec2bf9a37ed362007bf4..c6ea10652aca244ae4e721695e2718ea8816593f 100644 (file)
@@ -22,8 +22,8 @@ $b = new B();
 $b->foo();
 --EXPECT--
 bool(true)
-bool(false)
-bool(false)
 bool(true)
 bool(true)
-bool(false)
+bool(true)
+bool(true)
+bool(true)
index bf1caf8a98776710aa8dbd4b4f805e8766e7c349..b2daf3c4893a398f10029ca9aa865061c97e8a67 100644 (file)
@@ -1214,8 +1214,8 @@ ZEND_FUNCTION(property_exists)
        zend_uchar property_type;
        zend_class_entry *ce, **pce;
        zend_property_info *property_info;
-       zstr prop_name, class_name;
        zval property_z;
+       ulong h;
 
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zt", &object, &property, &property_len, &property_type) == FAILURE) {
                return;
@@ -1225,53 +1225,34 @@ ZEND_FUNCTION(property_exists)
                RETURN_FALSE;
        }
 
-       ZVAL_ZSTRL(&property_z, property_type, property, property_len, 0);
-
-       switch(Z_TYPE_P(object)) {
-       case IS_STRING:
-       case IS_UNICODE:
-               if (!Z_UNILEN_P(object)) {
-                       RETURN_FALSE;
-               }
-               if (zend_u_lookup_class(Z_TYPE_P(object), Z_UNIVAL_P(object), Z_UNILEN_P(object), &pce TSRMLS_CC) == SUCCESS) {
-                       ce = *pce;
-               } else {
-                       RETURN_FALSE;
-               }
-               if (!ce) {
-                       RETURN_NULL();
-               }
-               if (!(property_info = zend_get_property_info(ce, &property_z, 1 TSRMLS_CC)) || property_info == &EG(std_property_info)) {
+       if (Z_TYPE_P(object) == IS_STRING || Z_TYPE_P(object) == IS_UNICODE) {
+               if (zend_u_lookup_class(Z_TYPE_P(object), Z_UNIVAL_P(object), Z_UNILEN_P(object), &pce TSRMLS_CC) == FAILURE) {
                        RETURN_FALSE;
                }
-               if (property_info->flags & ZEND_ACC_PUBLIC) {
-                       RETURN_TRUE;
-               }
-               zend_u_unmangle_property_name(property_type, property_info->name, property_info->name_length, &class_name, &prop_name);
-               if (class_name.s[0] ==  '*') {
-                       if (instanceof_function(EG(scope), ce TSRMLS_CC) ||
-                               (EG(This) && instanceof_function(Z_OBJCE_P(EG(This)), ce TSRMLS_CC))) {
-                               RETURN_TRUE;
-                       }
-                       RETURN_FALSE;
-               }
-               if (zend_u_lookup_class(Z_TYPE_P(object), Z_UNIVAL_P(object), Z_UNILEN_P(object), &pce TSRMLS_CC) == SUCCESS) {
-                       ce = *pce;
-               } else {
-                       RETURN_FALSE; /* shouldn't happen */
-               }
-               RETURN_BOOL(EG(scope) == ce);
-
-       case IS_OBJECT:
-               if (Z_OBJ_HANDLER_P(object, has_property) && Z_OBJ_HANDLER_P(object, has_property)(object, &property_z, 2 TSRMLS_CC)) {
-                       RETURN_TRUE;
-               }
-               RETURN_FALSE;
-
-       default:
+               ce = *pce;      
+       } else if (Z_TYPE_P(object) == IS_OBJECT) {
+               ce = Z_OBJCE_P(object);
+       } else {
                zend_error(E_WARNING, "First parameter must either be an object or the name of an existing class");
                RETURN_NULL();
        }
+       
+       h = zend_u_get_hash_value(property_type, property, property_len+1);
+       if (zend_u_hash_quick_find(&ce->properties_info, property_type, property, property_len+1, h, (void **) &property_info) == SUCCESS) {
+               if (property_info->flags & ZEND_ACC_SHADOW) {
+                       RETURN_FALSE;
+               }
+               RETURN_TRUE;
+       }
+       
+       ZVAL_ZSTRL(&property_z, property_type, property, property_len, 0);
+       
+       if (Z_TYPE_P(object) == IS_OBJECT &&
+               Z_OBJ_HANDLER_P(object, has_property) &&
+               Z_OBJ_HANDLER_P(object, has_property)(object, &property_z, 2 TSRMLS_CC)) {
+               RETURN_TRUE;
+       }
+       RETURN_FALSE;
 }
 /* }}} */