thinkphp 5.0 命名空间
命名空间
命名空间
ThinkPHP5采用命名空间方式定义和自动加载类库文件,有效的解决了多模块和Composer类库之间的命名空间冲突问题,并且实现了更加高效的类库自动加载机制。
如果不清楚命名空间的基本概念,可以参考PHP手册:PHP命名空间
特别注意的是,如果你需要调用PHP内置的类库,或者第三方没有使用命名空间的类库,记得在实例化类库的时候加上
\,例如:// 错误的用法
$class = new stdClass();
$xml = new SimpleXmlElement($xmlstr);
// 正确的用法
$class = new \stdClass();
$xml = new \SimpleXmlElement($xmlstr);
在ThinkPHP5.0中,只需要给类库正确定义所在的命名空间,并且命名空间的路径与类库文件的目录一致,那么就可以实现类的自动加载,从而实现真正的惰性加载。
例如,\think\cache\driver\File类的定义为:
namespace think\cache\driver;
class File
{
}
如果我们实例化该类的话,应该是:
$class = new \think\cache\driver\File();
系统会自动加载该类对应路径的类文件,其所在的路径是 thinkphp/library/think/cache/driver/File.php。
5.0默认的目录规范是小写,类文件命名是驼峰法,并且首字母大写。
原则上,可以支持驼峰法命名的目录,只要命名空间定义和目录一致即可,例如:
我们实例化
$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_PATH目录(自动注册)。
请注意本手册中的示例代码为了简洁,如无指定类库的命名空间的话,都表示指的是
think命名空间,例如下面的代码:
Route::get('hello','index/hello');
请自行添加 use think\Route或者使用
\think\Route::get('hello','index/hello');
自动注册
我们只需要把自己的类库包目录放入EXTEND_PATH目录(默认为extend,可配置),就可以自动注册对应的命名空间,例如:
我们在extend目录下面新增一个my目录,然后定义一个\my\Test类( 类文件位于extend/my/Test.php)如下:
namespace my;
class Test
{
public function sayHello()
{
echo 'hello';
}
}
我们就可以直接实例化和调用:
$Test = new \my\Test();
$Test->sayHello();
如果我们在应用入口文件中重新定义了EXTEND_PATH常量的话,还可以改变\my\Test类文件的位置,例如:
define('EXTEND_PATH','../vendor/');
那么\my\Test类文件的位置就变成了/vendor/my/File.php。
手动注册
也可以通过手动注册的方式注册新的根命名空间,例如:
在应用入口文件中添加下面的代码:
\think\Loader::addNamespace('my','../application/extend/my/');
如果要同时注册多个根命名空间,可以使用:
\think\Loader::addNamespace([
'my' => '../application/extend/my/',
'org' => '../application/extend/org/',
]);
也可以直接在应用的配置文件中添加配置,系统会在应用执行的时候自动注册。
'root_namespace' => [
'my' => '../application/extend/my/',
'org' => '../application/extend/org/',
]
应用类库包
为了避免和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' => 'application',
定义后,应用类库的命名空间改为:
namespace application\index\model;
class User extends \think\Model
{
}
命名空间别名
框架允许给命名空间定义别名,例如:
namespace app\index\model;
use think\Model;
class User extends Model
{
}
原来在控制器里面调用方式为:
namespace app\index\controller;
use app\index\model\User;
class Index
{
public function index()
{
$user = new User();
}
}
如果我们在应用公共文件中注册命名空间别名如下:
\think\Loader::addNamespaceAlias('model','app\index\model');
那么,上面的控制器代码就可以更改为:
namespace app\index\controller;
use model\User;
class Index
{
public function index()
{
$user = new User();
}
}
thinkphp 5.0 命名空间的更多相关文章
- thinkphp 5.0 模块设计
模块设计 5.0版本对模块的功能做了灵活设计,默认采用多模块的架构,并且支持单一模块设计,所有模块的命名空间均以app作为根命名空间(可配置更改). 目录结构 标准的应用和模块目录结构如下: ├─ap ...
- ThinkPHP V5.0 正式版发布
ThinkPHP5.0版本是一个颠覆和重构版本,官方团队历时十月,倾注了大量的时间和精力,采用全新的架构思想,引入了更多的PHP新特性,优化了核心,减少了依赖,实现了真正的惰性加载,支持compose ...
- thinkphp5.0命名空间
命名空间 ThinkPHP采用命名空间方式定义和自动加载类库文件,有效的解决了多模块和Composer类库之间的命名空间冲突问题,并且实现了更加高效的类库自动加载机制. 如果不清楚命名空间的基本概念, ...
- ThinkPHP 5.0远程命令执行漏洞分析与复现
0x00 前言 ThinkPHP官方2018年12月9日发布重要的安全更新,修复了一个严重的远程代码执行漏洞.该更新主要涉及一个安全更新,由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的 ...
- 把VueThink整合到已有ThinkPHP 5.0项目中
享 关键字: VueThink ThinkPHP5.0 Vue2.x TP5 管理后台扩展 VueThink初认识 VueThink,是一个很不错的技术框架,由广州洪睿科技的技术团队2016年研发( ...
- ThinkPHP 5.0/5.1 自定义404界面的配置
★ 背景还要啥背景,就是觉得不可能用框架自带的 404 界面呗.可能跟之前的版本配置方法有点区别,在此做一下简单的笔记 框架:ThinkPHP 5.1,ThinkPHP5.0.20 ★ 配置过程♩. ...
- thinkphp 5.0 lnmp环境下 无法访问,报错500(public目录)
两种方法: 1.修改fastcgi的配置文件 /usr/local/nginx/conf/fastcgi.conf fastcgi_param PHP_ADMIN_VALUE "open_b ...
- ThinkPHP 5.0.x SQL注入分析
前言 前段时间,晴天师傅在朋友圈发了一张ThinkPHP 注入的截图.最近几天忙于找工作的事情,没来得及看.趁着中午赶紧搭起环境分析一波.Think PHP就不介绍了,搞PHP的都应该知道. 环境搭建 ...
- thinkPHP -01- thinkPHP5.0 安装与测试
thinkPHP -01- thinkPHP5.0 安装与测试 1.thinkPHP 5 官网下载地址:http://www.thinkphp.cn/down.html 2.打开 Wampserver ...
随机推荐
- HDU2629:Identity Card
Problem Description Do you own an ID card?You must have a identity card number in your family's Hous ...
- js中的clientWidth offsetWidth scrollWidth等的含义
网页可见区域宽: document.body.clientWidth;网页可见区域高: document.body.clientHeight;网页可见区域宽: document.body.offset ...
- 今天开通博客,记录我作为一个小菜鸟在iOS学习中的点点滴滴
一直以来都是默默的关注各位同仁,没有为网站作什么贡献. 现在借开始学习iOS开发的这个机会开博,集中于介绍这个过程,激励我自己. 谢谢大家!
- C#常用集合的使用
大多数集合都在System.Collections,System.Collections.Generic两个命名空间.其中System.Collections.Generic专门用于泛型集合. 针对特 ...
- 自定义cell,根据数据源,要对cell的布局进行调整,没有实现调整的相应效果
自定义cell,用于两种显示情况,首次进来A种情况(主材页面),正确显示,然后切换B种情况(辅材情况),可以正确显示,但是当再次切换回A种情况(主材情况)的时候,主材cell不能正常显示了,遗留的B中 ...
- max_%_connection参数详解
对于连接数的设置,show variables里有三个参数可以对它进行控制,max_connections与max_user_connections以及max_connect_errors.下面对这三 ...
- icon在页面中的使用
https://icomoon.io/app/#/select 1.上传.svg新图标 2.选中那个小图标,点底部导航的生成字体. 3.然后命名,下载. 4.下载下来的内容只有这两处是必须要用的. 5 ...
- POJ 3368/RMQ/线段数
题目链接 /* 给出一段序列,询问[L,R]区间内最大相同数的个数. 用一个很巧妙地方法,转化成求区间内的最大值的问题. RMQ维护区间最大值. MAX处理: */ for(int i=1;i< ...
- 使用URL工具类调用webservice接口(soap)与http接口的实现方式
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...
- 线程访问 DevExpress控件异常时 解决方法
Control.CheckForIllegalCrossThreadCalls = false; DevExpress.Data.CurrencyDataController.DisableThrea ...