命名空间是一个重要的概念。该系列文章详细介绍了PHP对命名空间的支持及用法。原文地址:http://www.sitepoint.com/php-53-namespaces-basics/
命名空间是PHP 5.3诸多重要更新中的一个。它会使C#和Java开发者感到友好,同时很有希望使PHP应用的程序结构变得更好。
|
1
2
3
4
|
<?php// define this code in the ‘MyProject‘ namespacenamespace MyProject;// ... code ... |
|
1
2
3
4
5
6
7
8
9
10
|
<?phpnamespace MyProject1;// PHP code for the MyProject1 namespacenamespace MyProject2;// PHP code for the MyProject2 namespace// Alternative syntaxnamespace MyProject3 { // PHP code for the MyProject3 namespace}?> |
虽然这种用法从语法方面讲是可行的,但明智的做法是每个文件定义一个命名空间。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<?php// application library 1namespace App\Lib1;const MYCONST = ‘App\Lib1\MYCONST‘;function MyFunction() { return __FUNCTION__;}class MyClass { static function WhoAmI() { return __METHOD__; }}?> |
在另一个PHP文件中包含此文件。
myapp.php
|
1
2
3
4
5
6
7
|
<?phpheader(‘Content-type: text/plain‘);require_once(‘lib1.php‘);echo \App\Lib1\MYCONST . "\n";echo \App\Lib1\MyFunction() . "\n";echo \App\Lib1\MyClass::WhoAmI() . "\n";?> |
因在myapp.php中未定义任何命名空间,所以全部代码都位于全局空间内。任何对MYCONST、MyFunction 或者MyClass 的直接引用都会失败,因为他们位于App\Lib1命名空间内。当想调用lib1.php中的代码,必须加上”\App\Lib1″前缀形成完全限定名(fully-qualified names)。myapp.php的运行结果为:
App\Lib1\MYCONST
App\Lib1\MyFunction
App\Lib1\MyClass::WhoAmI
完全限定名也会很长,而且相对于诸如 App-Lib1-MyClass这样的长类名并无明显好处。因此,在下篇文章中将会讨论命名空间别名,同时对PHP如何处理命名空间做近距离观察。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<?php// application library 1namespace App\Lib1;const MYCONST = ‘App\Lib1\MYCONST‘;function MyFunction() { return __FUNCTION__;}class MyClass { static function WhoAmI() { return __METHOD__; }}?> |
lib2.php
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<?php// application library 2namespace App\Lib2;const MYCONST = ‘App\Lib2\MYCONST‘;function MyFunction() { return __FUNCTION__;}class MyClass { static function WhoAmI() { return __METHOD__; }}?> |
|
1
2
3
4
5
6
7
8
9
|
<?phpnamespace App\Lib1;require_once(‘lib1.php‘);require_once(‘lib2.php‘);header(‘Content-type: text/plain‘);echo MYCONST . "\n";echo MyFunction() . "\n";echo MyClass::WhoAmI() . "\n";?> |
虽然同时包含了lib1.php和lib2.php,但MYCONST, MyFunction, and MyClass只会引用lib1.php中的代码。因为myapp1.php的代码同样位于App\lib1命名空间内。 result: App\Lib1\MYCONST App\Lib1\MyFunction App\Lib1\MyClass::WhoAmI 命名空间导入 命名空间可通过use操作符导入。例如 myapp2.php
|
1
2
3
4
5
6
7
8
9
|
<?phpuse App\Lib2;require_once(‘lib1.php‘);require_once(‘lib2.php‘);header(‘Content-type: text/plain‘);echo Lib2\MYCONST . "\n";echo Lib2\MyFunction() . "\n";echo Lib2\MyClass::WhoAmI() . "\n";?> |
App\Lib2\MYCONST App\Lib2\MyFunction App\Lib2\MyClass::WhoAmI
|
1
2
3
4
5
6
7
8
9
10
11
|
<?phpuse App\Lib1 as L;use App\Lib2\MyClass as Obj;header(‘Content-type: text/plain‘);require_once(‘lib1.php‘);require_once(‘lib2.php‘);echo L\MYCONST . "\n";echo L\MyFunction() . "\n";echo L\MyClass::WhoAmI() . "\n";echo Obj::WhoAmI() . "\n";?> |
App\Lib1\MYCONST App\Lib1\MyFunction App\Lib1\MyClass::WhoAmI App\Lib2\MyClass::WhoAmI
A\B\C\D\e()。new A\B\C()。
5. 命名空间内的未限定函数调用会在运行时解析。例如:如果MyFunction()在命名空间A\B内被调用,PHP首先会搜索函数\A\B\MyFunction(),如果未找到匹配项,PHP会在全局空间内搜索\MyFunction()函数。
6. 调用未限定或部分限定名的类会在运行时解析。例如:如果在命名空间A\B内调用new C(),PHP会搜索类A\B\C,如果未能找到匹配项,PHP将会试图自动载入类A\B\C。How to Use PHP Namespaces, Part 1: The Basics
原文:http://www.cnblogs.com/dsphper/p/4231697.html