mirror of
https://github.com/php/php-src.git
synced 2024-09-21 09:57:23 +00:00
T_IMPORT -> T_USE
This commit is contained in:
parent
38e93fe401
commit
b7d87bebc9
@ -39,8 +39,8 @@ Namespace or class name can be imported:
|
||||
|
||||
<?php
|
||||
require 'Zend/Db/Connection.php';
|
||||
import Zend::DB;
|
||||
import Zend::DB::Connection as DbConnection;
|
||||
use Zend::DB;
|
||||
use Zend::DB::Connection as DbConnection;
|
||||
|
||||
$x = new Zend::DB::Connection();
|
||||
$y = new DB::connection();
|
||||
@ -48,13 +48,13 @@ $z = new DbConnection();
|
||||
DB::connect();
|
||||
?>
|
||||
|
||||
import statement only defines name aliasing. It may create name alias for
|
||||
namespace or class. The simple form of statement "import A::B::C::D;" is
|
||||
equivalent to "import A::B::C::D as D;". Import statement can be used at any
|
||||
The use statement only defines name aliasing. It may create name alias for
|
||||
namespace or class. The simple form of statement "use A::B::C::D;" is
|
||||
equivalent to "use A::B::C::D as D;". The use statement can be used at any
|
||||
time in the global scope (not inside function/class) and takes effect from
|
||||
the point of definition down to the end of file. It is recommended however to
|
||||
place imports at the beginning of the file. Import statements have effect
|
||||
only on the file where they appear.
|
||||
place the use statements at the beginning of the file. The use statements have
|
||||
effect only on the file where they appear.
|
||||
|
||||
The special "empty" namespace (:: prefix) is useful as explicit global
|
||||
namespace qualification. All class and function names started from ::
|
||||
@ -83,10 +83,10 @@ In global namespace __NAMESPACE__ constant has the value of empty string.
|
||||
Names inside namespace are resolved according to the following rules:
|
||||
|
||||
1) all qualified names are translated during compilation according to
|
||||
current import rules. So if we have "import A::B::C" and then "C::D::e()"
|
||||
current import rules. So if we have "use A::B::C" and then "C::D::e()"
|
||||
it is translated to "A::B::C::D::e()".
|
||||
2) unqualified class names translated during compilation according to
|
||||
current import rules. So if we have "import A::B::C" and then "new C()" it
|
||||
current import rules. So if we have "use A::B::C" and then "new C()" it
|
||||
is translated to "new A::B::C()".
|
||||
3) inside namespace, calls to unqualified functions that are defined in
|
||||
current namespace (and are known at the time the call is parsed) are
|
||||
|
@ -5,8 +5,8 @@ Bug #42859 import always conflicts with internal classes
|
||||
namespace Foo;
|
||||
class Ex {}
|
||||
|
||||
import Blah::Exception;
|
||||
import Blah::Ex;
|
||||
use Blah::Exception;
|
||||
use Blah::Ex;
|
||||
?>
|
||||
--EXPECTF--
|
||||
Fatal error: Import name 'Ex' conflicts with defined class in %sbug42859.php on line 6
|
@ -10,9 +10,9 @@ class Foo {
|
||||
}
|
||||
}
|
||||
|
||||
import test::ns1::Foo as Bar;
|
||||
import test::ns1 as ns2;
|
||||
import test::ns1;
|
||||
use test::ns1::Foo as Bar;
|
||||
use test::ns1 as ns2;
|
||||
use test::ns1;
|
||||
|
||||
Foo::bar();
|
||||
test::ns1::Foo::bar();
|
||||
|
@ -3,7 +3,7 @@
|
||||
--FILE--
|
||||
<?php
|
||||
namespace X;
|
||||
import X as Y;
|
||||
use X as Y;
|
||||
class Foo {
|
||||
const C = "const ok\n";
|
||||
static $var = "var ok\n";
|
||||
|
@ -8,8 +8,8 @@ function foo() {
|
||||
echo __FUNCTION__,"\n";
|
||||
}
|
||||
|
||||
import test::ns1 as ns2;
|
||||
import test as ns3;
|
||||
use test::ns1 as ns2;
|
||||
use test as ns3;
|
||||
|
||||
foo();
|
||||
bar();
|
||||
|
@ -3,7 +3,7 @@
|
||||
--FILE--
|
||||
<?php
|
||||
namespace X;
|
||||
import X as Y;
|
||||
use X as Y;
|
||||
function foo() {
|
||||
echo __FUNCTION__,"\n";
|
||||
}
|
||||
|
@ -4,7 +4,7 @@
|
||||
<?php
|
||||
namespace a::b::c;
|
||||
|
||||
import a::b::c as test;
|
||||
use a::b::c as test;
|
||||
|
||||
require "ns_022.inc";
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
029: Name ambiguity (class name & import name)
|
||||
--FILE--
|
||||
<?php
|
||||
import A::B as Foo;
|
||||
use A::B as Foo;
|
||||
|
||||
class Foo {
|
||||
}
|
||||
|
@ -5,7 +5,7 @@
|
||||
class Foo {
|
||||
}
|
||||
|
||||
import A::B as Foo;
|
||||
use A::B as Foo;
|
||||
|
||||
new Foo();
|
||||
--EXPECTF--
|
||||
|
@ -2,7 +2,7 @@
|
||||
033: Import statement with non-compound name
|
||||
--FILE--
|
||||
<?php
|
||||
import A;
|
||||
use A;
|
||||
--EXPECTF--
|
||||
Warning: The import statement with non-compound name 'A' has no effect in %sns_033.php on line 2
|
||||
Warning: The use statement with non-compound name 'A' has no effect in %sns_033.php on line 2
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
--FILE--
|
||||
<?php
|
||||
namespace A;
|
||||
import A as B;
|
||||
use A as B;
|
||||
class Foo {
|
||||
const C = "ok\n";
|
||||
}
|
||||
|
@ -5,7 +5,7 @@
|
||||
--FILE--
|
||||
<?php
|
||||
namespace A;
|
||||
import A as B;
|
||||
use A as B;
|
||||
class ArrayObject {
|
||||
const STD_PROP_LIST = 2;
|
||||
}
|
||||
|
@ -3,7 +3,7 @@
|
||||
--FILE--
|
||||
<?php
|
||||
namespace X;
|
||||
import X as Y;
|
||||
use X as Y;
|
||||
class X {
|
||||
const C = "const ok\n";
|
||||
static $var = "var ok\n";
|
||||
|
@ -3,7 +3,7 @@
|
||||
--FILE--
|
||||
<?php
|
||||
namespace X;
|
||||
import X as Y;
|
||||
use X as Y;
|
||||
const A = "ok\n";
|
||||
const B = A;
|
||||
const C = array(A);
|
||||
|
@ -6,8 +6,8 @@ namespace test::ns1;
|
||||
|
||||
const FOO = "ok\n";
|
||||
|
||||
import test::ns1 as ns2;
|
||||
import test as ns3;
|
||||
use test::ns1 as ns2;
|
||||
use test as ns3;
|
||||
|
||||
echo FOO;
|
||||
echo test::ns1::FOO;
|
||||
|
@ -4600,7 +4600,7 @@ void zend_do_namespace(znode *name TSRMLS_DC) /* {{{ */
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
void zend_do_import(znode *ns_name, znode *new_name TSRMLS_DC) /* {{{ */
|
||||
void zend_do_use(znode *ns_name, znode *new_name TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
char *lcname;
|
||||
zval *name, *ns, tmp;
|
||||
@ -4618,7 +4618,7 @@ void zend_do_import(znode *ns_name, znode *new_name TSRMLS_DC) /* {{{ */
|
||||
} else {
|
||||
char *p;
|
||||
|
||||
/* The form "import A::B" is eqivalent to "import A::B as B".
|
||||
/* The form "use A::B" is eqivalent to "use A::B as B".
|
||||
So we extract the last part of compound name ti use as a new_name */
|
||||
name = &tmp;
|
||||
p = zend_memrchr(Z_STRVAL_P(ns), ':', Z_STRLEN_P(ns));
|
||||
@ -4660,7 +4660,7 @@ void zend_do_import(znode *ns_name, znode *new_name TSRMLS_DC) /* {{{ */
|
||||
zend_error(E_COMPILE_ERROR, "Cannot reuse import name");
|
||||
}
|
||||
if (warn) {
|
||||
zend_error(E_WARNING, "The import statement with non-compound name '%s' has no effect", Z_STRVAL_P(name));
|
||||
zend_error(E_WARNING, "The use statement with non-compound name '%s' has no effect", Z_STRVAL_P(name));
|
||||
}
|
||||
efree(lcname);
|
||||
zval_dtor(name);
|
||||
|
@ -506,7 +506,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_import(znode *name, znode *new_name TSRMLS_DC);
|
||||
void zend_do_use(znode *name, znode *new_name TSRMLS_DC);
|
||||
void zend_do_end_compilation(TSRMLS_D);
|
||||
|
||||
ZEND_API void function_add_ref(zend_function *function);
|
||||
|
@ -144,7 +144,6 @@
|
||||
%token T_CURLY_OPEN
|
||||
%token T_PAAMAYIM_NEKUDOTAYIM
|
||||
%token T_NAMESPACE
|
||||
%token T_IMPORT
|
||||
%token T_NS_C
|
||||
|
||||
%% /* Rules */
|
||||
@ -169,8 +168,8 @@ 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_IMPORT namespace_name ';' { zend_do_import(&$2, NULL TSRMLS_CC); }
|
||||
| T_IMPORT namespace_name T_AS T_STRING ';' { zend_do_import(&$2, &$4 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); }
|
||||
| constant_declaration ';'
|
||||
;
|
||||
|
||||
@ -225,7 +224,6 @@ unticked_statement:
|
||||
| T_ECHO echo_expr_list ';'
|
||||
| T_INLINE_HTML { zend_do_echo(&$1 TSRMLS_CC); }
|
||||
| expr ';' { zend_do_free(&$1 TSRMLS_CC); }
|
||||
| T_USE use_filename ';' { zend_error(E_COMPILE_ERROR,"use: Not yet supported. Please use include_once() or require_once()"); zval_dtor(&$2.u.constant); }
|
||||
| T_UNSET '(' unset_variables ')' ';'
|
||||
| T_FOREACH '(' variable T_AS
|
||||
{ zend_do_foreach_begin(&$1, &$2, &$3, &$4, 1 TSRMLS_CC); }
|
||||
@ -272,12 +270,6 @@ unset_variable:
|
||||
variable { zend_do_end_variable_parse(BP_VAR_UNSET, 0 TSRMLS_CC); zend_do_unset(&$1 TSRMLS_CC); }
|
||||
;
|
||||
|
||||
use_filename:
|
||||
T_CONSTANT_ENCAPSED_STRING { $$ = $1; }
|
||||
| '(' T_CONSTANT_ENCAPSED_STRING ')' { $$ = $2; }
|
||||
;
|
||||
|
||||
|
||||
function_declaration_statement:
|
||||
unticked_function_declaration_statement { zend_do_ticks(TSRMLS_C); }
|
||||
;
|
||||
|
@ -1202,10 +1202,6 @@ HEREDOC_CHARS ("{"*([^$\n\r\\{]|("\\"[^\n\r]))|{HEREDOC_LITERAL_DOLLAR}|({
|
||||
return T_NAMESPACE;
|
||||
}
|
||||
|
||||
<ST_IN_SCRIPTING>"import" {
|
||||
return T_IMPORT;
|
||||
}
|
||||
|
||||
<ST_IN_SCRIPTING>"use" {
|
||||
return T_USE;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user