PHP命名空间高级特性
接下来让我们看一看PHP命名空间的一些高级特性。
__NAMESPACE__常量
__NAMESPACE__是一个PHP字符串,它总是返回当前命名空间的名称,在全局空间中它是一个空字符串。
- < ?php
- namespace App\Lib1;
- echo __NAMESPACE__; // outputs: App\Lib1
- ?>
这个值在调试时非常有用,它也可由于动态生成一个完全限定类名,如:
- < ?php
- namespace App\Lib1;
- class MyClass {
- public function WhoAmI() {
- return __METHOD__;
- }
- }
- $c = __NAMESPACE__ . '\\MyClass';
- $m = new $c;
- echo $m->WhoAmI(); // outputs: App\Lib1\MyClass::WhoAmI
- ?>
namespace关键字
namespace关键字可以用于明确引用一个当前命名空间或子命名空间中的项目,它等价于类中的self命名空间:
- < ?php
- namespace App\Lib1;
- class MyClass {
- public function WhoAmI() {
- return __METHOD__;
- }
- }
- $m = new namespace\MyClass;
- echo $m->WhoAmI(); // outputs: App\Lib1\MyClass::WhoAmI
- ?>
自动载入命名空间类
PHP 5中最省时省力的特性是自动载入,在全局非命名空间)PHP代码中,可以写一个标准自动载入函数:
- < ?php
- $obj= new MyClass1(); // classes/MyClass1.php is auto-loaded
- $obj= new MyClass2(); // classes/MyClass2.php is auto-loaded
- // autoload function
- function __autoload($class_name) {
- require_once("classes/$class_name.php");
- }
- ?>
在PHP 5.3中,你可以创建一个命名空间类的实例,在这种情况下,完全限定命名空间和类名传递给__autoload函数,例如,$class_name的值可能是App\Lib1\MyClass。你可以在相同的文件夹下放置所有的PHP类文件,从字符串中提取命名空间,但那样会导致文件名冲突。
另外,你的类文件层次结构会按照命名空间的结构重新组织,例如,MyClass.php文件可以创建在/classes/App/Lib1文件夹下:
/classes/App/Lib1/MyClass.php
- < ?php
- namespace App\Lib1;
- class MyClass {
- public function WhoAmI() {
- return __METHOD__;
- }
- }
- ?>
在根文件夹下的文件就使用下面的代码了:
myapp.php
- < ?php
- use App\Lib1\MyClass as MC;
- $obj = new MC();
- echo $obj->WhoAmI();
- // autoload function
- function __autoload($class) {
- // convert namespace to full file path
- $class = 'classes/' . str_replace('\\', '/', $class) . '.php';
- require_once($class);
- }
- ?>
解释:
1.类App\Lib1\MyClass的别名是MC;
2. new MC( )在编译时被翻译成new App\Lib1\MyClass( );
3.字符串App\Lib1\MyClass被传递给__autoload函数,使用文件路径正斜线替换所有命名空间中的反斜线,然后修改字符串,classes\App\Lib1\MyClass.php文件被自动载入;
总结
有关PHP命名空间的使用就介绍到这里,希望您能够对PHP的命名空间有一个新的认识,并希望你能在新项目中真正使用命名空间。
原文:How to Use PHP Namespaces
作者:Craig Buckler
编辑推荐】
- PHP 5.3中的命名空间:你用过了么?
- PHP 5.3中的命名空间使用方法浅述
- PHP 5.3.0发布 新增命名空间等多项特性
- PHP的命名空间
- PHP 5.3闭包语法初探
PHP之友评论