]> granicus.if.org Git - php/commitdiff
- Fix situation where a derived class declares a public (or implicit public)
authorZeev Suraski <zeev@php.net>
Tue, 18 Mar 2003 16:30:23 +0000 (16:30 +0000)
committerZeev Suraski <zeev@php.net>
Tue, 18 Mar 2003 16:30:23 +0000 (16:30 +0000)
  with the same name as a private in the parent
- Optimize 'static binding' of private properties a bit

Zend/zend_compile.c
Zend/zend_object_handlers.c

index 749d8f49357ead8e456cee9806b04518df339fbf..a86a565ed0f23d87a16fe797942489e48a5c7833 100644 (file)
@@ -1682,6 +1682,9 @@ static zend_bool do_inherit_property_access_check(HashTable *target_ht, zend_pro
        zend_class_entry *parent_ce = ce->parent;
 
        if (parent_info->flags & ZEND_ACC_PRIVATE) {
+               if (zend_hash_quick_find(&ce->properties_info, hash_key->arKey, hash_key->nKeyLength, hash_key->h, (void **) &child_info)==SUCCESS) {
+                               child_info->flags |= ZEND_ACC_CHANGED;
+               }
                return 0; /* don't copy access information to child */
        }
 
index 7db7124ea3623dda05ab3e929a445a82f4897295..8c193afbf9f620a410f37422c66d3ae67b8c2d5d 100644 (file)
@@ -179,24 +179,40 @@ inline int zend_verify_property_access(zend_property_info *property_info, zend_c
 
 static inline zend_property_info *zend_get_property_info(zend_object *zobj, zval *member TSRMLS_DC)
 {
-       zend_property_info *property_info;
-       zend_bool found_info_in_object = 0;
+       zend_property_info *property_info = NULL;
+       zend_property_info *scope_property_info;
+       zend_bool denied_access = 0;
+
 
        ulong h = zend_get_hash_value(Z_STRVAL_P(member), Z_STRLEN_P(member)+1);
        if (zend_hash_quick_find(&zobj->ce->properties_info, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, h, (void **) &property_info)==SUCCESS) {
                if (zend_verify_property_access(property_info, zobj->ce TSRMLS_CC)) {
-                       return property_info;
+                       if (property_info->flags & ZEND_ACC_CHANGED
+                               && !(property_info->flags & ZEND_ACC_PRIVATE)) {
+                               /* We still need to make sure that we're not in a context
+                                * where the right property is a different 'statically linked' private
+                                * continue checking below...
+                                */
+                       } else {
+                               return property_info;
+                       }
                } else {
-                       found_info_in_object = 1;
+                       /* Try to look in the scope instead */
+                       denied_access = 1;
                }
        }
-       if (EG(scope)
-               && zend_hash_quick_find(&EG(scope)->properties_info, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, h, (void **) &property_info)==SUCCESS
-               && property_info->flags & ZEND_ACC_PRIVATE) {
-               /* ok */
-       } else if (found_info_in_object) {
-               /* Information was available, but we were denied access.  Error out. */
-               zend_error(E_ERROR, "Cannot access %s property %s::$%s", zend_visibility_string(property_info->flags), zobj->ce->name, Z_STRVAL_P(member));
+       if (EG(scope) != zobj->ce
+               && EG(scope)
+               && zend_hash_quick_find(&EG(scope)->properties_info, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, h, (void **) &scope_property_info)==SUCCESS
+               && scope_property_info->flags & ZEND_ACC_PRIVATE) {
+               return scope_property_info;
+       } else if (property_info) {
+               if (denied_access) {
+                       /* Information was available, but we were denied access.  Error out. */
+                       zend_error(E_ERROR, "Cannot access %s property %s::$%s", zend_visibility_string(property_info->flags), zobj->ce->name, Z_STRVAL_P(member));
+               } else {
+                       /* fall through, return property_info... */
+               }
        } else {
                EG(std_property_info).flags = ZEND_ACC_PUBLIC;
                EG(std_property_info).name = Z_STRVAL_P(member);