On Wed, 2004-02-25 at 15:41, Andi Gutmans wrote:
> Quick reminder...
> If you have any bugs to fix, please fix them in the coming days.
The following:
------------------------------------------------------------------
<?php
class Base {
public $id= 0;
}
class Child extends Base {
public $prop= '';
}
$p= &new Reflection_Property('Child', 'id');
echo 'Child::$id => ', $p->getDeclaringClass()->getName(), "\n";
$p= &new Reflection_Property('Child', 'prop');
echo 'Child::$prop => ', $p->getDeclaringClass()->getName(), "\n";
?>
------------------------------------------------------------------
currently prints out:
Child::$id => Base
Child::$prop => Base
Expected output is:
Child::$id => Base
Child::$prop => Child
Fix is attached. It also includes two more fixes. The first one replaces
searching for a zval** in ce->properties_info by passing a char* (we
will actually find something then:)). The second one fixes wrong
reporting of getDeclaringClass() in a situation in which the above test
script would have a private $prop in the Base class.
- Timm
Index: Zend/zend_reflection_api.c
===================================================================
RCS file: /repository/ZendEngine2/zend_reflection_api.c,v
retrieving revision 1.88
diff -u -r1.88 zend_reflection_api.c
--- Zend/zend_reflection_api.c 25 Feb 2004 08:58:56 -0000 1.88
+++ Zend/zend_reflection_api.c 26 Feb 2004 00:31:58 -0000
@@ -771,7 +771,10 @@
zend_class_entry *tmp_ce = ce->parent;
zend_property_info *tmp_info;
- while (tmp_ce && zend_hash_find(&ce->properties_info, prop_name, strlen(prop_name) + 1, (void **) &tmp_info) == SUCCESS) {
+ while (tmp_ce && zend_hash_find(&tmp_ce->properties_info, prop_name, strlen(prop_name) + 1, (void **) &tmp_info) == SUCCESS) {
+ if (tmp_info->flags != prop->flags) { /* private in super class, public in child => NOT the same property */
+ break;
+ }
ce = tmp_ce;
prop = tmp_info;
tmp_ce = tmp_ce->parent;
@@ -2564,19 +2567,22 @@
"Property %s::$%s does not exist", ce->name, name_str);
return;
}
- free_alloca(lcname);
-
+
if (!(property_info->flags & ZEND_ACC_PRIVATE)) {
/* we have to seach the class hierarchy for this (implicit) public or protected property */
zend_class_entry *tmp_ce = ce->parent;
zend_property_info *tmp_info;
- while (tmp_ce && zend_hash_find(&ce->properties_info, name_str, name_len + 1, (void **) &tmp_info) == SUCCESS) {
+ while (tmp_ce && zend_hash_find(&tmp_ce->properties_info, lcname, name_len + 1, (void **) &tmp_info) == SUCCESS) {
+ if (tmp_info->flags != property_info->flags) { /* private in super class, public in child => NOT the same property */
+ break;
+ }
ce = tmp_ce;
property_info = tmp_info;
tmp_ce = tmp_ce->parent;
}
}
+ free_alloca(lcname);
MAKE_STD_ZVAL(classname);
ZVAL_STRINGL(classname, ce->name, ce->name_length, 1);
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php