summaryrefslogtreecommitdiff
path: root/Zend
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2003-09-08 23:25:57 +0000
committerMarcus Boerger <helly@php.net>2003-09-08 23:25:57 +0000
commit9d0506ec54ad62a5a3fbead7dd8c7921f0dbd75e (patch)
tree754320c6b661c0fc067706b4d2f812d9f1a223a3 /Zend
parent4936234fd8af2f413b0ade2bec74f1fd6a2a1789 (diff)
downloadphp-git-9d0506ec54ad62a5a3fbead7dd8c7921f0dbd75e.tar.gz
Fix property inheritance where a derived class inherits a public property
and owns it as an implicit public property already (noticed by Brad).
Diffstat (limited to 'Zend')
-rw-r--r--Zend/zend_compile.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index cabe30332e..70dc5865ae 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -1750,7 +1750,7 @@ static zend_bool do_inherit_property_access_check(HashTable *target_ht, zend_pro
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;
+ child_info->flags |= ZEND_ACC_CHANGED;
}
return 0; /* don't copy access information to child */
}
@@ -1765,13 +1765,15 @@ static zend_bool do_inherit_property_access_check(HashTable *target_ht, zend_pro
if ((child_info->flags & ZEND_ACC_PPP_MASK) > (parent_info->flags & ZEND_ACC_PPP_MASK)) {
zend_error(E_COMPILE_ERROR, "Access level to %s::$%s must be %s (as in class %s)%s", ce->name, hash_key->arKey, zend_visibility_string(parent_info->flags), parent_ce->name, (parent_info->flags&ZEND_ACC_PUBLIC) ? "" : " or weaker");
} else if (child_info->flags & ZEND_ACC_IMPLICIT_PUBLIC) {
- /* Explicitly copy the value from the parent */
- zval **pvalue;
-
- if (zend_hash_quick_find(&parent_ce->default_properties, parent_info->name, parent_info->name_length+1, parent_info->h, (void **) &pvalue)==SUCCESS) {
- zend_hash_quick_update(&ce->default_properties, parent_info->name, parent_info->name_length+1, parent_info->h, pvalue, sizeof(zval *), NULL);
- (*pvalue)->refcount++;
- zend_hash_del(&ce->default_properties, child_info->name, child_info->name_length+1);
+ if (!(parent_info->flags & ZEND_ACC_IMPLICIT_PUBLIC)) {
+ /* Explicitly copy the default value from the parent (if it has one) */
+ zval **pvalue;
+
+ if (zend_hash_quick_find(&parent_ce->default_properties, parent_info->name, parent_info->name_length+1, parent_info->h, (void **) &pvalue)==SUCCESS) {
+ (*pvalue)->refcount++;
+ zend_hash_del(&ce->default_properties, child_info->name, child_info->name_length+1);
+ zend_hash_quick_update(&ce->default_properties, parent_info->name, parent_info->name_length+1, parent_info->h, pvalue, sizeof(zval *), NULL);
+ }
}
return 1; /* Inherit from the parent */
} else if ((child_info->flags & ZEND_ACC_PUBLIC) && (parent_info->flags & ZEND_ACC_PROTECTED)) {