ID: 26760 Updated by: [EMAIL PROTECTED] Reported By: eero at volotinen dot com Status: Bogus Bug Type: Unknown/Other Function -Operating System: linux 2.6 +Operating System: * -PHP Version: 5CVS-2004-01-01 (dev) +PHP Version: 5.0.0RC1-dev New Comment:
The patch has a memleak and does not work correct. Please try the following code: php -r 'if (1) {class a{const x=1;static function f(){return 1;}}}else{class a{const x=0;static function f(){return 0;}}}echo a::x.a::f()."\n";' php -r 'if (0) {class a{const x=1;static function f(){return 1;}}}else{class a{const x=0;static function f(){return 0;}}}echo a::x.a::f()."\n";' Both print '00' but the first should obviously print '11' Previous Comments: ------------------------------------------------------------------------ [2004-01-05 04:00:05] [EMAIL PROTECTED] This appears to fix the nesting class without affecting conditional definitions. Index: zend_compile.c =================================================================== RCS file: /repository/ZendEngine2/zend_compile.c,v retrieving revision 1.507 diff -u -r1.507 zend_compile.c --- zend_compile.c 3 Jan 2004 13:51:01 -0000 1.507 +++ zend_compile.c 5 Jan 2004 09:03:04 -0000 @@ -2315,6 +2315,11 @@ int doing_inheritance = 0; zend_class_entry *new_class_entry = emalloc(sizeof(zend_class_entry)); char *lcname = zend_str_tolower_dup(class_name->u.constant.value.str.val, class_name->u.constant.value.str.len); + + if (CG(active_class_entry) != NULL) { + efree(lcname); + zend_error(E_COMPILE_ERROR, "Cannot use nest class definitions"); + } if (!(strcmp(lcname, "self") && strcmp(lcname, "parent"))) { efree(lcname); Index: zend_language_parser.y =================================================================== RCS file: /repository/ZendEngine2/zend_language_parser.y,v retrieving revision 1.132 diff -u -r1.132 zend_language_parser.y --- zend_language_parser.y 27 Dec 2003 22:59:49 -0000 1.132 +++ zend_language_parser.y 5 Jan 2004 09:03:05 -0000 @@ -168,7 +168,9 @@ inner_statement: statement + | function_declaration_statement + | class_declaration_statement ; ------------------------------------------------------------------------ [2004-01-02 09:59:02] [EMAIL PROTECTED] Thank you for taking the time to write to us, but this is not a bug. Please double-check the documentation available at http://www.php.net/manual/ and the instructions on how to report a bug at http://bugs.php.net/how-to-report.php As Derick said. ------------------------------------------------------------------------ [2004-01-02 05:56:39] [EMAIL PROTECTED] I don't think that anything is broken here. You just can't have a conditional class definition (just like you can't instantiate a class before it's declared anymore). ------------------------------------------------------------------------ [2004-01-02 05:26:04] [EMAIL PROTECTED] Changing title. I suspect marcus's fix broke this. http://news.php.net/article.php?group=php.zend-engine.cvs&article=2159 ------------------------------------------------------------------------ [2004-01-02 05:07:53] eero at volotinen dot com Used this test script: <?php if(!defined("SQL_LAYER")) { define("SQL_LAYER","mysql"); class sql_db { var $test; } } // end if.. ?> Php reports error at line 7 which starts : class sql_db .. ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at http://bugs.php.net/26760 -- Edit this bug report at http://bugs.php.net/?id=26760&edit=1