命名空间

ThinkPHP采用命名空间方式定义和自动加载类库文件,有效的解决了多模块和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();
}
}

本手册后续的章节,均建立在你已经了解PHP命名空间的基础之上,如果不掌握请自行补充PHP基础,否则你在后续的文档和ThinkPHP5.0的学习过程中,对命名空间的缺乏理解会成为你最大的学习障碍。

thinkphp5.0命名空间的更多相关文章

  1. Thinkphp5.0实战开发一------命名空间详解

    序言 ThinkPHP是一个快速.兼容而且简单的轻量级国产PHP开发框架,使用ThinkPHP框架可以极大简化我们的开发过程,节省时间.这个专题我将记录自己学习使用ThinkPHP5.0的进行实战开发 ...

  2. 高性能PHP框架thinkphp5.0.0 Beta发布-为API开发而设计

    ThinkPHP V5.——为API开发而设计的高性能框架 ThinkPHP5..0版本是一个颠覆和重构版本,采用全新的架构思想,引入了很多的PHP新特性,优化了核心,减少了依赖,实现了真正的惰性加载 ...

  3. thinkphp5.0 自动加载

    自动加载 概述 ThinkPHP5.0真正实现了按需加载,所有类库采用自动加载机制,并且支持类库映射和composer类库的自动加载. 自动加载的实现由think\Loader类库完成,自动加载规范符 ...

  4. thinkphp 5.0 命名空间

    命名空间 命名空间 ThinkPHP5采用命名空间方式定义和自动加载类库文件,有效的解决了多模块和Composer类库之间的命名空间冲突问题,并且实现了更加高效的类库自动加载机制. 如果不清楚命名空间 ...

  5. 对thinkphp5.0框架的实例学习

    不论是渗透测试还是代码审计的过程中会碰到用不同的框架搭建起来的网站,熟悉这些框架的基本原理,会帮助我们快速的理解漏洞原理,提高干活效率,所以自己本地搭了个php环境,来入门实例学习下thinkphp5 ...

  6. thinkphp5.0和thinkphp3.2的区别不同之处

    先看目录结构: thinkphp 5.0的目录结构, 文档:https://www.kancloud.cn/manual/thinkphp5/118008 project 应用部署目录 ├─appli ...

  7. thinkphp5.0自动加载

    概述 ThinkPHP5.0 真正实现了按需加载,所有类库采用自动加载机制,并且支持类库映射和composer类库的自动加载. 自动加载的实现由think\Loader类库完成,自动加载规范符合PHP ...

  8. thinkphp5.0架构总览

    ThinkPHP5.0应用基于MVC(模型-视图-控制器)的方式来组织. MVC是一个设计模式,它强制性的使应用程序的输入.处理和输出分开.使用MVC应用程序被分成三个核心部件:模型(M).视图(V) ...

  9. thinkPHP5.0的学习研究【架构】

    2017年6月19日18:51:53 架构:1.ThinkPHP5.0应用基于MVC(模型-视图-控制器)的方式来组织.2.MVC是一个设计模式,它强制性的使应用程序的输入.处理和输出分开.使用MVC ...

随机推荐

  1. P1801 黑匣子_NOI导刊2010提高(06)

    P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...

  2. LeetCode-Max Points on a Line[AC源码]

    package com.lw.leet3; import java.util.HashMap; import java.util.Iterator; import java.util.Map; imp ...

  3. cmd窗口关闭 -----window小技巧!

    前沿 平时开发的时候经常用到windows  的命令行工具来启动程序  或是 查看本地数据库的信息 : 经常的手动关闭 ,对于我这种,能用键盘完成的就坚决不用鼠标的人是多么痛苦. 所以在此罗列了一些命 ...

  4. 关于NuGet

    一.NuGet是什么? NuGet是Microsoft开发平台的程序集包管理器,它由客户端工具和服务端站点组成,客户端工具提供给用户管理和安装/卸载软件程序包,以及打包和发布程序包到NuGet服务端站 ...

  5. CURL 简介【转载】

    转自http://hancang2010.blog.163.com/blog/static/1824602612010711104018261/ 0) 头信息 curl命令查询服务器头信息 curl ...

  6. c++都忘记了,看了看那本发黄的C++primer,还是要去翻下了

    char *s="string"和char s[]="string"的区别 void main() { char* pStr1 = "Hello!&q ...

  7. Spring Boot中对log4j进行多环境不同日志级别的控制

    之前介绍了在<Spring boot中使用log4j记录日志>,仅通过log4j.properties对日志级别进行控制,对于需要多环境部署的环境不是很方便,可能我们在开发环境大部分模块需 ...

  8. 【Git】git clone与git pull区别

    从字面意思也可以理解,都是往下拉代码,git clone是克隆,git pull 是拉.但是,也有区别: 从远程服务器克隆一个一模一样的版本库到本地,复制的是整个版本库,叫做clone.(clone是 ...

  9. [004] last_k_node

    [Description] find the k-th node from the last node of single linked list. e.g. Linked-list: 1-2-3-4 ...

  10. Android :ExpandableListActivity

    http://developer.android.com/reference/android/app/ExpandableListActivity.html# public class Expanda ...