如何使用php 命名空间(Namespaces)(2)引入和化名

原文地址:https://www.sitepoint.com/php-namespaces-import-alias-resolution/

在前面一篇,我们讨论了为什么php的命名空间有用,以及命名空间的一些语法上的关键点。在这一篇,我们将讲解如何使用它。

首先,我将会写两段代码,他们的区别仅仅是命名空间的名字不同。

Lib1.php

Lib2.php

然后进入主题。

0.给3个定义

全限定的名称(Fully-qualified name)

任何php代码能涉及一个全限定的名称--- 就像命名空间那种用反斜杠'\'分离一样。比如AppLib1MYCONST这样的。

全限定的名称显得意义清晰。最初的反斜杠操作出现在文件的路径里。如果我们执行了一个不同的MyFunction()在全局空间中他是来自于lib1.php还是lib2.php。

全限定的名称对一次性的function或者object来说很有用。然而这样命名在多次调用的时候显得不切合实际。我们在接下来的内容中发现,php提供了其他的方式在命名空间这方面拯救我们。

限定的名称(Qualified name)

具备至少一个分割比如Lib1MyFunction()

非限定的名称(Unqualified name)

不具备任何分割比如MyFunction()

1.在同一个命名空间中工作

考虑下一下的代码:

myapp1.php

尽管我们引入了lib1.php和lib2.php,这个识别MYCONST,MyFunction()和MyClass将只关联lib1.php

,这是因为myapp1.php的代码只在AppLib1的命名空间中。

以下是结果:

App\Lib1\MYCONST
App\Lib1\MyFunction
App\Lib1\MyClass::WhoAmI

2.命名空间的引入

命名空间可以通过use来引入

myapp2.php

任何数量的命名空间都可以被use来引入,你可以把不同的空间用逗号分隔开。在这个例子中,我们引入了AppLib2命名空间。我们依旧不能直接调用MYCONST,MyFunction或者MyClass因为我们的代码在全局空间里。然而,如果我们加了Lib2前缀,他们就成为了限定的名称,php将会在命名空间去查找他。

以下是结果:

App\Lib1\MYCONST
App\Lib2\MyFunction
App\Lib2\MyClass::WhoAmI

3.命名空间别名

命名空间的别名,这个称呼好怪,其实很简单,第一篇我们看到,其实命名空间的名字也是很长的,为什么不用一个短的替换掉呢?就像设置一个常量一样。

第一个use声明把AppLib1定义为L,任何限定名称使用L将在编译的时候自动转义为AppLib1。

第二个use声明把MyClass也包含了进去。这种用法只针对Class 对constant和function都不行,我们可以直接使用new Obj()来跑静态方法了。

以下是结果:

App\Lib1\MYCONST
App\Lib1\MyFunction
App\Lib1\MyClass::WhoAmI
App\Lib2\MyClass::WhoAmI


你可能感兴趣的:(php)