Dmitry Stogov wrote: > Looks fine, but probably we should emit error only if class declared in > the same source file. > > Thanks. Dmitry. >
Great, didn't realize how easy this would be. Attached patch does this, but requires another test: 067.php.inc: <?php class B { function __construct(){echo __CLASS__;} } ?> --TEST-- 067: Name ambiguity (import name & userspace class name in another file) --FILE-- <?php include __DIR__ . '/066.php.inc'; include __DIR__ . '/067.php.inc'; use A::B; new B(); --EXPECT-- A::B I can't express how excited I am about this patch - it fixes the biggest single problem with the "use" statement and negates the need for any weird stuff like "namespace __user__;" as proposed. Now, once we fix resolution rules, namespaces will be stellar. Greg
Index: Zend/zend_compile.c =================================================================== RCS file: /repository/ZendEngine2/zend_compile.c,v retrieving revision 1.647.2.27.2.41.2.68 diff -u -r1.647.2.27.2.41.2.68 zend_compile.c --- Zend/zend_compile.c 15 Jun 2008 18:27:37 -0000 1.647.2.27.2.41.2.68 +++ Zend/zend_compile.c 20 Jun 2008 16:37:53 -0000 @@ -4959,6 +4959,7 @@ char *lcname; zval *name, *ns, tmp; zend_bool warn = 0; + zend_class_entry **pce; if (!CG(current_import)) { CG(current_import) = emalloc(sizeof(HashTable)); @@ -5012,14 +5013,16 @@ efree(tmp); } efree(ns_name); - } else if (zend_hash_exists(CG(class_table), lcname, Z_STRLEN_P(name)+1)) { - char *tmp = zend_str_tolower_dup(Z_STRVAL_P(ns), Z_STRLEN_P(ns)); - - if (Z_STRLEN_P(ns) != Z_STRLEN_P(name) || - memcmp(tmp, lcname, Z_STRLEN_P(ns))) { - zend_error(E_COMPILE_ERROR, "Cannot use %s as %s because the name is already in use", Z_STRVAL_P(ns), Z_STRVAL_P(name)); + } else if (SUCCESS == zend_hash_find(CG(class_table), lcname, Z_STRLEN_P(name)+1, (void **)&pce)) { + if (pce[0]->type == ZEND_USER_CLASS && !strcmp(pce[0]->filename, CG(compiled_filename))) { + char *tmp = zend_str_tolower_dup(Z_STRVAL_P(ns), Z_STRLEN_P(ns)); + + if (Z_STRLEN_P(ns) != Z_STRLEN_P(name) || + memcmp(tmp, lcname, Z_STRLEN_P(ns))) { + zend_error(E_COMPILE_ERROR, "Cannot use %s as %s because the name is already in use", Z_STRVAL_P(ns), Z_STRVAL_P(name)); + } + efree(tmp); } - efree(tmp); } if (zend_hash_add(CG(current_import), lcname, Z_STRLEN_P(name)+1, &ns, sizeof(zval*), NULL) != SUCCESS) {
-- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php