Hi. This is quick patch. I didn't think/read source carefully, but it compiles following scripts and it works.
<?php class A { function foo() { echo 'A'; } } class B extends A{ function foo() { echo 'B'; } } $A = new A; $B = new B; $A->foo(); $B->foo(); ?> It echos "AB" with this patch. [yohgaki@dev TEST-DEV]$ cat ttt.php <?php class A { function foo() { echo 'A'; } } class B { function foo() { echo 'B'; } function foo() { echo 'C'; } } $A = new A; $B = new B; $A->foo(); $B->foo(); ?> [yohgaki@dev TEST-DEV]$ ./sapi/cli/php ttt.php PHP Fatal error: Cannot redeclare method foo() in ttt.php on line 13 ttt.php(13) : Fatal error - Cannot redeclare method foo() Fatal error: Cannot redeclare method foo() in ttt.php on line 13 -- Yasuo Ohgaki
/usr/bin/diff: conflicting specifications of output style --- zend_compile.c.~1.226.~ Tue Mar 26 03:48:18 2002 +++ zend_compile.c Wed Mar 27 01:13:14 2002 @@ -732,8 +732,15 @@ op_array.return_reference = return_reference; if (is_method) { - if (zend_hash_add(&CG(active_class_entry)->function_table, name, name_len+1, &op_array, sizeof(zend_op_array), (void **) &CG(active_op_array)) == FAILURE) { - zend_error(E_ERROR, "Cannot redeclare method %s()", name); + zend_class_entry *parent_class; + if (Z_STRVAL(CG(active_ce_parent_class_name)) && + zend_hash_find(CG(class_table), +Z_STRVAL(CG(active_ce_parent_class_name)), +Z_STRLEN(CG(active_ce_parent_class_name))+1, (void **) &parent_class) == SUCCESS) { + zend_hash_update(&CG(active_class_entry)->function_table, +name, name_len+1, &op_array, sizeof(zend_op_array), (void **) &CG(active_op_array)); + } + else { + if (zend_hash_add(&CG(active_class_entry)->function_table, +name, name_len+1, &op_array, sizeof(zend_op_array), (void **) &CG(active_op_array)) +== FAILURE) { + zend_error(E_ERROR, "Cannot redeclare method %s()", +name); + } } } else { zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);
-- PHP Development Mailing List <http://www.php.net/> To unsubscribe, visit: http://www.php.net/unsub.php