PHP命名空间及自动加载浅析

命名空间

什么是命名空间呢?

命名空间(英语:Namespace)表示标识符(identifier)的可见范围。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其它命名空间中。

简单说来命名空间是为了解决不同库在同一个环境下使用时出现的命名冲突。例如我自己有一个函数名叫A,但是系统已经有一个A函数了,那就会出现冲突。

命名空间主要是为了解决代码中类和函数可能存在冲突的问题,而这个特性其他语言一早就有,PHP则是姗姗来迟,它的出现催生了
PSR-4 的诞生,从而也催生了 Composer 的兴起,所以是非常重要的特性。

PHP中的命名空间

PHP从5.3版本开始引入了命名空间,之后许多现有PHP类库以及框架都开始支持它。那么PHP的命名空间怎么用呢?

命名空间的定义

定义命名空间

下面是一个定义命名空间的例子

<?php    
//file a.php
namespace A;

const test = 'Atest'; 

function test() { 
    return __FUNCTION__; 
}

class Test{
    public function __construct(){
        return __METHOD__;
    }
}
?>

上面例子中就是一个典型的命名空间定义方法,只有constfunction,class受命名空间的约束。

命名空间是一个容器,这个容器主要是为了识别其下的类和函数。一旦定义了命名空间,它下面的代码就属于这个命名空间了,所以命名空间的定义要在代码的最开始行。

使用命名空间

使用命名空间的方式如下:

<?php 
namespace B;
use A;

const test = 'Btest';
function test() { 
    return __FUNCTION__; 
}

class Test{
    public function __construct(){
        return __METHOD__;
    }
}

include "a.php";//必须包含A命名空间的文件

// 完全限定
// `Btest`从绝对位置查找输出,如果是全局函数则`test`
echo Btest;   //输出Btest

// 限定名称  
// 这里已经通过`use A`申明了在这个文件可以通过`A...`使用A命名空间的函数
echo Atest;    //输出Atest

// 非限定名称
// 非限定名称的函数`test`会从当前命名控件查找,即B
echo test;      //输出Btest

// namespace关键字代表当前命名空间
echo namespace/test;
?>

首先要注意的是命名空间只起申明作用,也就是在使用了命名空间的时候依然得把这个命名空间申明的那个文件包含进来。在使用中可以通过__NAMESPACE__来查看当前命名空间。

更多内容可以查看PHP官方文档

对于同一个包来说,同一个命名空间或者子命名空间的代码没有必要在一个 PHP
文件中定义,子命名空间下的代码是为了完成特定模块的工作,组合起来就是一个包完整的命名空间。

自动加载

每个文件既要申明命名控件又要手动include是非常不智能的事情,所以在自己的PHP系统或者框架中可以使用自动加载技术,让系统自己去找

最简单的方式是利用函数__autoload函数,但是这个函数只能在非命名控件下定义,也就是全局情况下:

function __autoload($class) {
  $dir = './';
  set_include_path(get_include_path().PATH_SEPARATOR.$ids_dir);
  $class = str_replace('\', '/', $class) . '.php'; 
  require_once($class); }

如果在已经有了命名空间的类中,可以使用函数spl_autoload_register来注册一个类中的方法来代替__autoload

假如编写的代码没有定义命名空间,那说明它属于全局的命名空间,所以能够直接引用类或者函数。

引用命名空间标识符的三种方式

Fully-qualified name

类似于操作系统上的绝对路径,而且是完整的路径,所以在理解的时候不会有误解。

比如在 new ABC ,那么 C 就被会解析到 AB 命名空间下的 C 类。

澳门新葡亰网址,Qualified name

类似于操作系统上的相对路径,它包含部分名字并被引用到当前的命名空间。

比如 BC() 在命名空间 A 下调用,则最终引用的命名空间就是
ABCUnqualified name

类似于Qualified name,但是没包括子命名空间。

比如 C() 在命名空间 AB 下调用,则最终引用的命名空间就是 ABC()。

通过一个例子来说明三种引用方式:

namespace Example;require_once "fnction.php";class ClassA {}function Function() {}//完全限定名称ExampleFunction();ExampleBFunction; //指向 ExampleBFunction();//非限定名称$test = new ClassA(); //resolves to ExampleClassAFunction(); //指向 ExampleFunction

注意:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图