]> granicus.if.org Git - php/commitdiff
Allowed import of global classes "use ::GlobalClassName;"
authorDmitry Stogov <dmitry@php.net>
Thu, 13 Dec 2007 10:02:03 +0000 (10:02 +0000)
committerDmitry Stogov <dmitry@php.net>
Thu, 13 Dec 2007 10:02:03 +0000 (10:02 +0000)
Zend/tests/ns_061.phpt [new file with mode: 0644]
Zend/tests/ns_062.phpt [new file with mode: 0644]
Zend/zend_compile.c
Zend/zend_compile.h
Zend/zend_language_parser.y

diff --git a/Zend/tests/ns_061.phpt b/Zend/tests/ns_061.phpt
new file mode 100644 (file)
index 0000000..a02f63d
--- /dev/null
@@ -0,0 +1,9 @@
+--TEST--
+061: use in global scope
+--FILE--
+<?php
+class A {}
+use ::A as B;
+echo get_class(new B)."\n";
+--EXPECT--
+A
diff --git a/Zend/tests/ns_062.phpt b/Zend/tests/ns_062.phpt
new file mode 100644 (file)
index 0000000..07043db
--- /dev/null
@@ -0,0 +1,12 @@
+--TEST--
+062: use ::global class
+--FILE--
+<?php
+namespace Foo;
+use ::stdClass;
+use ::stdClass as A;
+echo get_class(new stdClass)."\n";
+echo get_class(new A)."\n";
+--EXPECT--
+stdClass
+stdClass
index b4f3d88a03da8cd667ce462529d275b97e05cdd6..334816d1a761b6795f81ca76837d736e30da4f1a 100644 (file)
@@ -4777,7 +4777,7 @@ void zend_do_namespace(znode *name TSRMLS_DC) /* {{{ */
 }
 /* }}} */
 
-void zend_do_use(znode *ns_name, znode *new_name TSRMLS_DC) /* {{{ */
+void zend_do_use(znode *ns_name, znode *new_name, int is_global TSRMLS_DC) /* {{{ */
 {
        char *lcname;
        zval *name, *ns, tmp;
@@ -4804,7 +4804,7 @@ void zend_do_use(znode *ns_name, znode *new_name TSRMLS_DC) /* {{{ */
                } else {
                        *name = *ns;
                        zval_copy_ctor(name);
-                       warn = 1;
+                       warn = !is_global;
                }
        }
 
index a2a8dcd05332025ce791e031f0e56bc2c8c8eceb..b96de1c9a2d8f906971d89770f7e690f109556a4 100644 (file)
@@ -510,7 +510,7 @@ void zend_do_abstract_method(znode *function_name, znode *modifiers, znode *body
 void zend_do_declare_constant(znode *name, znode *value TSRMLS_DC);
 void zend_do_build_namespace_name(znode *result, znode *prefix, znode *name TSRMLS_DC);
 void zend_do_namespace(znode *name TSRMLS_DC);
-void zend_do_use(znode *name, znode *new_name TSRMLS_DC);
+void zend_do_use(znode *name, znode *new_name, int is_global TSRMLS_DC);
 void zend_do_end_compilation(TSRMLS_D);
 
 ZEND_API void function_add_ref(zend_function *function);
index a407b50133d433aac006dc8c73375c393297484b..fe260c99d803e262d86486cf23153e22d79816c7 100644 (file)
@@ -168,8 +168,10 @@ top_statement:
        |       class_declaration_statement             { zend_do_early_binding(TSRMLS_C); }
        |       T_HALT_COMPILER '(' ')' ';'             { zend_do_halt_compiler_register(TSRMLS_C); YYACCEPT; }
        |       T_NAMESPACE namespace_name ';'  { zend_do_namespace(&$2 TSRMLS_CC); }
-       |       T_USE namespace_name ';'                { zend_do_use(&$2, NULL TSRMLS_CC); }
-       |       T_USE namespace_name T_AS T_STRING ';'  { zend_do_use(&$2, &$4 TSRMLS_CC); }
+       |       T_USE namespace_name ';'                { zend_do_use(&$2, NULL, 0 TSRMLS_CC); }
+       |       T_USE namespace_name T_AS T_STRING ';'  { zend_do_use(&$2, &$4, 0 TSRMLS_CC); }
+       |       T_USE T_PAAMAYIM_NEKUDOTAYIM T_STRING ';'               { zend_do_use(&$3, NULL, 1 TSRMLS_CC); }
+       |       T_USE T_PAAMAYIM_NEKUDOTAYIM T_STRING T_AS T_STRING ';'         { zend_do_use(&$3, &$5, 1 TSRMLS_CC); }
        |       constant_declaration ';'
 ;