命名空间

ThinkPHP5.1符合PSR-4自动加载规范,用命名空间方式定义和自动加载类库文件,解决了多模块和Composer类库之间的命名空间冲突问题,高效类库自动加载

命名空间的基本概念 PHP命名空间 http://www.php.net/manual/zh/language.namespaces.php

调用PHP内置的类库 或第三方没有使用命名空间的类库 实例化类库时加上\

// 错误的用法
$class = new stdClass();
$xml  =  new SimpleXmlElement($xmlstr);
// 正确的用法
$class = new \stdClass();
$xml  =  new \SimpleXmlElement($xmlstr);

PSR-4自动加载规范,只需要给类库正确定义所在的命名空间 ,且命名空间的路径与类库文件的目录一致,就可以实现类的自动加载 从而实现真正的惰性加载。

\think\cache\driver\File类的定义为:

namespace think\cache\driver;
class File {}

实例化该类  $class = new \think\cache\driver\File();

系统会自动加载该类对应路径的类文件 其所在的路径是 thinkphp/library/think/cache/driver/File.php

默认的目录规范是小写,类文件命名是驼峰法且首字母大写

根命名空间(类库包)

根命名空间是关键的概念
\think\cache\driver\File
think就是个根命名空间,其对应的初始命名空间目录就是系统的类库目录(thinkphp/library/think)  可以理解根命名空间对应了个类库包。

系统内置的几个根命名空间(类库包)

名称描述类库目录
think系统核心类库thinkphp/library/think
traits系统Trait类库thinkphp/library/traits
app应用类库application

如果需要增加新的根命名空间  只需要把自己的类库包目录放入extend目录 就可以自动注册对应的命名空间 例如:

extend目录下面新增个my目录 然后定义个myTest类( 类文件位于extend/my/Test.php)如下:


就可以直接实例化和调用:

$Test = new myTest();
$Test->sayHello();

如果你的扩展类库不希望放入系统默认的extend目录 就需要在应用配置文件中设置root_namespace注册根命名空间 例如下面注册了myorg两个根命名空间到application/extend目录下面。

namespace my;
class Test 
{
    public function sayHello()
    {
        echo 'hello';
    }
}

应用类库包

为了避免和Composer自动加载的类库存在冲突  应用类库的命名空间的根都统一以app命名 例如:

namespace app\index\model;
class User extends \think\Model
{
}

其类文件位于 application/index/model/User.php

namespace app\admin\event;
class User {
}

其类文件位于 application/admin/event/User.php

如果觉得app根命名空间不合适或有冲突 可以更改环境变量APP_NAMESPACE 如果你定义了.env文件的话 可以在里面添加:

APP_NAMESPACE =  application

定义后 应用类库的命名空间改为:

<?php
namespace application\index\model;
class User extends \think\Model
{
}