标签:
命名空间是一个重要的概念。该系列文章详细介绍了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‘ namespace namespace MyProject; // ... code ... |
1
2
3
4
5
6
7
8
9
10
|
<?php namespace MyProject1; // PHP code for the MyProject1 namespace namespace MyProject2; // PHP code for the MyProject2 namespace // Alternative syntax namespace MyProject3 { // PHP code for the MyProject3 namespace } ?> |
虽然这种用法从语法方面讲是可行的,但明智的做法是每个文件定义一个命名空间。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<?php // application library 1 namespace 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
|
<?php header( ‘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 1 namespace 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 2 namespace 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
|
<?php namespace 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
|
<?php use 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
|
<?php use 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