]> granicus.if.org Git - php/commitdiff
Change "Cannot redeclare class X" into "Cannot redeclare class/interface/trait X...
authorKalle Sommer Nielsen <kalle@php.net>
Wed, 25 Mar 2015 05:31:11 +0000 (06:31 +0100)
committerKalle Sommer Nielsen <kalle@php.net>
Wed, 25 Mar 2015 05:31:11 +0000 (06:31 +0100)
 C:\> php -r "trait A { } trait A { }"

Will now properly print "Cannot redeclare trait A" instead of "Cannot redeclare class A" to make error messages a tiny bit clearer. Admittedly, a better solution can most likely be made by actually telling what the colliding object is a type of.

Internally this adds a new function:
 zend_get_object_type()

Zend/tests/class_alias_004.phpt
Zend/tests/class_alias_010.phpt
Zend/zend_API.c
Zend/zend_API.h
Zend/zend_builtin_functions.c
Zend/zend_compile.c
ext/opcache/zend_accelerator_util_funcs.c

index b7dbabdeb09944cb5e6a06f93ac3139cfbb9e4dd..b9370dde0e898b7e51053fa5b35a3cd3a72975c2 100644 (file)
@@ -12,4 +12,4 @@ class_alias('foo', 'test');
 
 ?>
 --EXPECTF--
-Warning: Cannot redeclare class test in %s on line %d
+Warning: Cannot redeclare class test in %s on line %d
\ No newline at end of file
index 38590b664a34d8916666f4a9a1c764037537ccae..0eff174351521e03f2ea3b79548e4288d5099940 100644 (file)
@@ -11,4 +11,4 @@ class b { }
 
 ?>
 --EXPECTF--
-Warning: Cannot redeclare class b in %s on line %d
+Warning: Cannot redeclare interface b in %s on line %d
index 6dd7bcae5e1e5bb5c15ba0ef949ccefba124d937..2f62fa0ba1578b10ebfdb5c4b4185f7124949cb2 100644 (file)
@@ -4137,6 +4137,18 @@ ZEND_API void zend_ctor_make_null(zend_execute_data *execute_data) /* {{{ */
 }
 /* }}} */
 
+ZEND_API char *zend_get_object_type(zend_class_entry *ce) /* {{{ */
+{
+       if(ce->ce_flags & ZEND_ACC_TRAIT) {
+               return "trait";
+       } else if (ce->ce_flags & ZEND_ACC_INTERFACE) {
+               return "interface";
+       } else {
+               return "class";
+       }
+}
+/* }}} */
+
 /*
  * Local variables:
  * tab-width: 4
index 7513fd00114b9f64bdcae0dd683e4eb1ed6fdc48..deaec0294764dbde64074f0dc0cd861380bb5755 100644 (file)
@@ -540,6 +540,8 @@ ZEND_API zend_string *zend_resolve_method_name(zend_class_entry *ce, zend_functi
 
 ZEND_API void zend_ctor_make_null(zend_execute_data *execute_data);
 
+ZEND_API char *zend_get_object_type(zend_class_entry *ce);
+
 #define add_method(arg, key, method)   add_assoc_function((arg), (key), (method))
 
 ZEND_API ZEND_FUNCTION(display_disabled_function);
index a620e45a658b213860d122a7eae601f32817c4b8..ecb9078db0d798fe653ef489cdf357b2218d286c 100644 (file)
@@ -1536,7 +1536,7 @@ ZEND_FUNCTION(class_alias)
                        if (zend_register_class_alias_ex(alias_name, alias_name_len, ce) == SUCCESS) {
                                RETURN_TRUE;
                        } else {
-                               zend_error(E_WARNING, "Cannot redeclare class %s", alias_name);
+                               zend_error(E_WARNING, "Cannot redeclare %s %s", zend_get_object_type(ce), alias_name);
                                RETURN_FALSE;
                        }
                } else {
index ffe1b9279d68f62d4e267df55c0c33512806ec11..f8ac5264569806336ecbf6319edb193efe47e35a 100644 (file)
@@ -1002,7 +1002,7 @@ ZEND_API zend_class_entry *do_bind_class(const zend_op_array* op_array, const ze
                         * so we shut up about it.  This allows the if (!defined('FOO')) { return; }
                         * approach to work.
                         */
-                       zend_error_noreturn(E_COMPILE_ERROR, "Cannot redeclare class %s", ce->name->val);
+                       zend_error_noreturn(E_COMPILE_ERROR, "Cannot redeclare %s %s", zend_get_object_type(ce), ce->name->val);
                }
                return NULL;
        } else {
@@ -1036,13 +1036,13 @@ ZEND_API zend_class_entry *do_bind_inherited_class(const zend_op_array *op_array
                         * so we shut up about it.  This allows the if (!defined('FOO')) { return; }
                         * approach to work.
                         */
-                       zend_error_noreturn(E_COMPILE_ERROR, "Cannot redeclare class %s", Z_STRVAL_P(op2));
+                       zend_error_noreturn(E_COMPILE_ERROR, "Cannot redeclare %s %s", zend_get_object_type(Z_OBJCE_P(op2)), Z_STRVAL_P(op2));
                }
                return NULL;
        }
 
        if (zend_hash_exists(class_table, Z_STR_P(op2))) {
-               zend_error_noreturn(E_COMPILE_ERROR, "Cannot redeclare class %s", ce->name->val);
+               zend_error_noreturn(E_COMPILE_ERROR, "Cannot redeclare %s %s", zend_get_object_type(ce), ce->name->val);
        }
 
        zend_do_inheritance(ce, parent_ce);
@@ -1051,7 +1051,7 @@ ZEND_API zend_class_entry *do_bind_inherited_class(const zend_op_array *op_array
 
        /* Register the derived class */
        if (zend_hash_add_ptr(class_table, Z_STR_P(op2), ce) == NULL) {
-               zend_error_noreturn(E_COMPILE_ERROR, "Cannot redeclare class %s", ce->name->val);
+               zend_error_noreturn(E_COMPILE_ERROR, "Cannot redeclare %s %s", zend_get_object_type(ce), ce->name->val);
        }
        return ce;
 }
index 20b097b202a076c69402a300880553dc537f3a6b..bd373d90d3ea96b399d4b76765f0c1e2368a0034 100644 (file)
@@ -755,7 +755,7 @@ failure:
        CG(in_compilation) = 1;
        zend_set_compiled_filename(ce1->info.user.filename);
        CG(zend_lineno) = ce1->info.user.line_start;
-       zend_error(E_ERROR, "Cannot redeclare class %s", ce1->name->val);
+       zend_error(E_ERROR, "Cannot redeclare %s %s", zend_get_object_type(ce1), ce1->name->val);
 }
 
 #ifdef __SSE2__