not found"). (Ilia)
- Fixed bug #36214 (__get method works properly only when conditional operator
is used). (Dmitry)
+- Fixed bug #35634 (Erroneous "Class declarations may not be nested" error
+ raised). (Carl P. Corliss, Dmitry)
- Fixed bug #35106 (nested foreach fails when array variable has a reference).
(Dmitry)
--- /dev/null
+--TEST--
+Bug #35634 (Erroneous "Class declarations may not be nested" error raised)
+--INI--
+error_reporting=0
+--FILE--
+<?php
+if (defined("pass3")) {
+
+ class ErrorClass {
+ }
+
+} else if (defined("pass2")) {
+
+ class TestClass {
+ function __construct() {
+ }
+ function TestClass() {
+ $this->__construct();
+ }
+ }
+
+} else {
+
+ function errorHandler($errorNumber, $errorMessage, $fileName, $lineNumber) {
+ define("pass3", 1);
+ include(__FILE__);
+ die("Error: $errorMessage ($fileName:$lineNumber)\n");
+ }
+
+ set_error_handler('errorHandler');
+ define("pass2", 1);
+ include(__FILE__);
+}
+?>
+--EXPECTF--
+Error: Redefining already defined constructor for class TestClass (%sbug35634.php:12)
char *error_filename;
uint error_lineno;
zval *orig_user_error_handler;
+ zend_bool in_compilation;
+ zend_class_entry *saved_class_entry;
TSRMLS_FETCH();
/* Obtain relevant filename and lineno */
orig_user_error_handler = EG(user_error_handler);
EG(user_error_handler) = NULL;
-
+
+ /* User error handler may include() additinal PHP files.
+ * If an error was generated during comilation PHP will compile
+ * such scripts recursivly, but some CG() variables may be
+ * inconsistent. */
+
+ in_compilation = zend_is_compiling(TSRMLS_C);
+ if (in_compilation) {
+ saved_class_entry = CG(active_class_entry);
+ CG(active_class_entry) = NULL;
+ }
+
if (call_user_function_ex(CG(function_table), NULL, orig_user_error_handler, &retval, 5, params, 1, NULL TSRMLS_CC)==SUCCESS) {
if (retval) {
if (Z_TYPE_P(retval) == IS_BOOL && Z_LVAL_P(retval) == 0) {
zend_error_cb(type, error_filename, error_lineno, format, args);
}
+ if (in_compilation) {
+ CG(active_class_entry) = saved_class_entry;
+ }
+
if (!EG(user_error_handler)) {
EG(user_error_handler) = orig_user_error_handler;
}