PHP 7.0.6 Released

## 使用命名空间：别名/导入

(PHP 5 >= 5.3.0, PHP 7)

Example #1 使用use操作符导入/使用别名

 <?phpnamespace foo;use My\Full\Classname as Another;// 下面的例子与 use My\Full\NSname as NSname 相同use My\Full\NSname;// 导入一个全局类use ArrayObject;// importing a function (PHP 5.6+)use function My\Full\functionName;// aliasing a function (PHP 5.6+)use function My\Full\functionName as func;// importing a constant (PHP 5.6+)use const My\Full\CONSTANT;$obj = new namespace\Another; // 实例化 foo\Another 对象$obj = new Another; // 实例化 My\Full\Classname　对象NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func$a = new ArrayObject(array(1)); // 实例化 ArrayObject 对象// 如果不使用 "use \ArrayObject" ，则实例化一个 foo\ArrayObject 对象func(); // calls function My\Full\functionNameecho CONSTANT; // echoes the value of My\Full\CONSTANT?>  注意对命名空间中的名称（包含命名空间分隔符的完全限定名称如 Foo\Bar以及相对的不包含命名空间分隔符的全局名称如 FooBar）来说，前导的反斜杠是不必要的也不推荐的，因为导入的名称必须是完全限定的，不会根据当前的命名空间作相对解析。 为了简化操作，PHP还支持在一行中使用多个use语句 Example #2 通过use操作符导入/使用别名，一行中包含多个use语句  <?phpuse My\Full\Classname as Another, My\Full\NSname;$obj = new Another; // 实例化 My\Full\Classname 对象NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func?> 

Example #3 导入和动态名称

 <?phpuse My\Full\Classname as Another, My\Full\NSname;$obj = new Another; // 实例化一个 My\Full\Classname 对象$a = 'Another';$obj = new$a;      // 实际化一个 Another 对象?> 

Example #4 导入和完全限定名称

 <?phpuse My\Full\Classname as Another, My\Full\NSname;$obj = new Another; // instantiates object of class My\Full\Classname$obj = new \Another; // instantiates object of class Another$obj = new Another\thing; // instantiates object of class My\Full\Classname\thing$obj = new \Another\thing; // instantiates object of class Another\thing?> 

### Scoping rules for importing

The use keyword must be declared in the outermost scope of a file (the global scope) or inside namespace declarations. This is because the importing is done at compile time and not runtime, so it cannot be block scoped. The following example will show an illegal use of the use keyword:

Example #5 Illegal importing rule

 <?phpnamespace Languages;class Greenlandic{    use Languages\Danish;    ...}?> 

Note:

Importing rules are per file basis, meaning included files will NOT inherit the parent file's importing rules.

### User Contributed Notes 14 notes

40
k at webnfo dot com
3 years ago
 Note that you can not alias global namespace:use \ as test;echo test\strlen('');won't work. 
19
x at d dot a dot r dot k dot REMOVEDOTSANDTHIS dot gray dot org
3 years ago
 You are allowed to "use" the same resource multiple times as long as it is imported under a different alias at each invocation.For example:<?phpuse Lend;use Lend\l1;use Lend\l1 as l3;use Lend\l2;use Lend\l1\Keller;use Lend\l1\Keller as Stellar;use Lend\l1\Keller as Zellar;use Lend\l2\Keller as Dellar;...?>In the above example, "Keller", "Stellar", and "Zellar" are all references to "\Lend\l1\Keller", as are "Lend\l1\Keller", "l1\Keller", and "l3\Keller". 
14
cl
3 years ago
 Something that is not immediately obvious, particular with PHP 5.3, is that namespace resolutions within an import are not resolved recursively.  i.e.: if you alias an import and then use that alias in another import then this latter import will not be fully resolved with the former import.For example:use \Controllers as C;use C\First;use C\Last;Both the First and Last namespaces are NOT resolved as \Controllers\First or \Controllers\Last as one might intend. 
13
anon
2 years ago
 The <?php use ?> statement does not load the class file. You have to do this with the <?php require ?> statement or by using an autoload function. 
kelerest123 at gmail dot com
1 year ago
 For the fifth example (example #5):When in block scope, it is not an illegal use of use keyword, because it is used for sharing things with traits. 
15
c dot 1 at smithies dot org
4 years ago
 If you are testing your code at the CLI, note that namespace aliases do not work!(Before I go on, all the backslashes in this example are changed to percent signs because I cannot get sensible results to display in the posting preview otherwise. Please mentally translate all percent signs henceforth as backslashes.)Suppose you have a class you want to test in myclass.php:<?phpnamespace my%space;class myclass { // ...}?>and you then go into the CLI to test it. You would like to think that this would work, as you type it line by line:require 'myclass.php';use my%space%myclass; // should set 'myclass' as alias for 'my%space%myclass'$x = new myclass; // FATAL ERRORI believe that this is because aliases are only resolved at compile time, whereas the CLI simply evaluates statements; so use statements are ineffective in the CLI.If you put your test code into test.php:<?phprequire 'myclass.php';use my%space%myclass;$x = new myclass;//...?>it will work fine.I hope this reduces the number of prematurely bald people. 
Anonymous
3 years ago
 The last example on this page shows a possibly incorrect attempt of aliasing, but it is totally correct to import a trait \Languages\Languages\Danish. 
me at ruslanbes dot com
29 days ago
 Note the code use ns1\c1 may refer to importing class c1 from namespace ns1 as well as importing whole namespace ns1\c1 or even import both of them in one line. Example:<?phpnamespace ns1;class c1{}namespace ns1\c1;class c11{}namespace main;use ns1\c1;$c1 = new c1();$c11 = new c1\c11();var_dump($c1); // object(ns1\c1)#1 (0) { }var_dump($c11); // object(ns1\c1\c11)#2 (0) { } 
sernuzh at gmail dot com
11 months ago
 You'll get here the Fatal error: Cannot declare class others\name because the name is already in useSo you can't get two classes <name> inside one namespace<?phpnamespace my {class name {public function __construct(){echo 'my_namespace_object';}}}namespace others{use my\name;class name {public function __construct(){echo 'others_namespace_object';}}$newObject = new name();}?>  -1 samuel dot roze at gmail dot com 3 years ago  (All the backslashes in namespaces are slashes because I can't figure out how to post backslashes here.)You can have the same "use" for a class and a namespace. For example, if you have these files:<?php// foo/bar.phpnamespace foo;class bar{ public function __toString () { return 'foo\bar\__toString()'; }}?><?php// foo/bar/MyClass.phpnamespace foo/bar;class MyClass{ public function __toString () { return 'foo\bar\MyClass\__toString()'; }}?>In another namespace, you can do:<?phpnamespace another;require_once 'foo/bar.php';require_once 'foo/bar/MyClass.php';use foo/bar;$bar = new bar();echo $bar."\n";$class = new bar/MyClass();echo $class."\n";?>And it will makes the following output:foo\bar\__toString()foo\bar\MyClass\__toString()  -1 nsdhami at live dot jp 5 years ago  The "use" keyword can not be declared inside the function or method. It should be declared as global, after the "namespace" as:<?phpnamespace mydir;// works perfectlyuse mydir/subdir/Class1 as Class1;function fun1(){ // Parse error: syntax error, unexpected T_USE use mydir/subdir/Class1 as Class1;}class Class2{ public function fun2() { // Parse error: syntax error, unexpected T_USE use mydir/subdir/Class1 as Class1; }}?>  -1 thinice at gmail.com 5 years ago  Because imports happen at compile time, there's no polymorphism potential by embedding the use keyword in a conditonal.e.g.:<?phpif ($objType == 'canine') {  use Animal\Canine as Beast;}if ($objType == 'bovine') { use Animal\Bovine as Beast;}$oBeast = new Beast;$oBeast->feed();?>  -18 Jan Tvrdk 5 years ago  Importing and aliasing an interface name is also supported.  -23 Dr. Gianluigi &#34;Zane&#34; Zanettini 1 year ago  I was attempting to use something like this:<?phpuse$my_variable_namespace?>This is not supported. I did this instead:<?phpif(..)    use My\First\Namespace;else    use My\Other\Namespace;?>