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

Reply via email to