命名空间
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\Filethink
就是个根命名空间,其对应的初始命名空间目录就是系统的类库目录(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
注册根命名空间 例如下面注册了my
和org
两个根命名空间到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 { }
尊贵的董事大人
英文标题不为空时 视为本栏投稿
需要关键字 描述 英文标题