博主信息
博文 3
粉丝 0
评论 0
访问量 3301
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
使用命名空间:别名/导入
薛定谔的猫的博客
原创
1086人浏览过

(PHP 5 >= 5.3.0, PHP 7)

允许通过别名引用或导入外部的完全限定名称,是命名空间的一个重要特征。这有点类似于在类 unix 文件系统中可以创建对其它的文件或目录的符号连接。


所有支持命名空间的PHP版本支持三种别名或导入方式:为类名称使用别名、为接口使用别名或为命名空间名称使用别名。PHP 5.6开始允许导入函数或常量或者为它们设置别名。


在PHP中,别名是通过操作符 use 来实现的. 下面是一个使用所有可能的五种导入方式的例子:


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


<?php

namespace 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\functionName

echo CONSTANT; // echoes the value of My\Full\CONSTANT

?>

注意对命名空间中的名称(包含命名空间分隔符的完全限定名称如 Foo\Bar以及相对的不包含命名空间分隔符的全局名称如 FooBar)来说,前导的反斜杠是不必要的也不推荐的,因为导入的名称必须是完全限定的,不会根据当前的命名空间作相对解析。

为了简化操作,PHP还支持在一行中使用多个use语句


Example #2 通过use操作符导入/使用别名,一行中包含多个use语句


<?php

use My\Full\Classname as Another, My\Full\NSname;


$obj = new Another; // 实例化 My\Full\Classname 对象

NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func

?>

导入操作是在编译执行的,但动态的类名称、函数名称或常量名称则不是。


Example #3 导入和动态名称


<?php

use My\Full\Classname as Another, My\Full\NSname;


$obj = new Another; // 实例化一个 My\Full\Classname 对象

$a = 'Another';

$obj = new $a;      // 实际化一个 Another 对象

?>

另外,导入操作只影响非限定名称和限定名称。完全限定名称由于是确定的,故不受导入的影响。


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


<?php

use 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


<?php

namespace 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.

 add a note

User Contributed Notes 20 notes


up

down

28 dominic_mayers at yahoo dot com ¶1 year ago

The keyword "use" has been recycled for three distinct applications: 

1- to import/alias classes, traits, constants, etc. in namespaces, 

2- to insert traits in classes, 

3- to inherit variables in closures. 

This page is only about the first application: importing/aliasing. Traits can be inserted in classes, but this is different from importing a trait in a namespace, which cannot be done in a block scope, as pointed out in example 5. This can be confusing, especially since all searches for the keyword "use" are directed to the documentation here on importing/aliasing.

up

down

58 k at webnfo dot com ¶4 years ago

Note that you can not alias global namespace:


use \ as test;


echo test\strlen('');


won't work.

up

down

44 anon ¶3 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.

up

down

9 me at ruslanbes dot com ¶1 year 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:


<?php

namespace 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) { }

up

down

6 xzero at elite7hackers dot net ¶6 months ago

I couldn't find answer to this question so I tested myself. 

I think it's worth noting:


<?php

use ExistingNamespace\NonExsistingClass;

use ExistingNamespace\NonExsistingClass as whatever;

use NonExistingNamespace\NonExsistingClass;

use NonExistingNamespace\NonExsistingClass as whatever;

?>


None of above will actually cause errors unless you actually try to use class you tried to import. 


<?php

// And this code will issue standard PHP error for non existing class.

use ExistingNamespace\NonExsistingClass as whatever;

$whatever = new whatever();

?>

up

down

6 ZhangLiang ¶9 months ago

In Chinese,there is an error in translation:

// 如果不使用 "use \ArrayObject" ,则实例化一个 foo\ArrayObject 对象

it should be

// 如果不使用 "use ArrayObject" ,则实例化一个 foo\ArrayObject 对象


/*********************************************/

中文下翻译有错误

// 如果不使用 "use \ArrayObject" ,则实例化一个 foo\ArrayObject 对象

这句话应该是

// 如果不使用 "use ArrayObject" ,则实例化一个 foo\ArrayObject 对象

up

down

21 cl ¶4 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.

up

down

22 x at d dot a dot r dot k dot REMOVEDOTSANDTHIS dot gray dot org ¶4 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:


<?php

use 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;


...


?>


本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学