thinkPHP5.0框架命名空间详解

本文实例讲述了thinkPHP5.0框架命名空间。分享给大家供大家参考,具体如下:

命名空间

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的学习过程中,对命名空间的缺乏理解会成为你最大的学习障碍。

更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《Zend FrameWork框架入门教程》、《smarty模板入门基础教程》及《PHP模板技术总结》。

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

(0)

相关推荐

  • ThinkPHP模板比较标签用法详解

    ThinkPHP模板引擎提供了丰富的比较标签,其用法格式为: <比较标签 name="变量" value="值">内容</比较标签> ThinkPHP系统支持的比较标签及其所表示的含义分别是: eq或者 equal:等于 neq 或者notequal:不等于 gt:大于 egt:大于等于 lt:小于 elt:小于等于 heq:恒等于 nheq:不恒等于 1.比较标签的用法基本是一致的,区别在于判断的条件不同. 如eq标签: <eq na

  • Thinkphp模板中使用自定义函数的方法

    注意:自定义函数要放在项目应用目录/common/common.php中. 这里是关键. 模板变量的函数调用格式:{$varname|function1|function2=arg1,arg2,### } 说明: { 和 $ 符号之间不能有空格,后面参数的空格就没有问题: ###表示模板变量本身的参数位置 : 支持多个函数,函数之间支持空格 : 支持函数屏蔽功能,在配置文件中可以配置禁止使用的函数列表 : 支持变量缓存功能,重复变量字串不多次解析. 使用例子: {$webTitle|md5|st

  • ThinkPHP使用smarty模板引擎的方法

    ThinkPHP支持多种php模板引擎,可以根据个人需要加以配置. 下面我们以Smarty模板引擎为例,给大家说说具体的操作流程! 首先去Smarty官网上下载一个Smarty.本站下载地址:http://www.jb51.net/codes/16086.html. 接下来解压压缩包,会有两个文件夹:demo和libs.打开libs文件夹,复制所有内容. 接下来,打开你网站根目录 下thinkphp的文件夹.里面有个vendor文件夹,这个文件夹是TP调用第三方类库用的,把刚才复制的东西全部粘贴

  • thinkphp模板继承实例简述

    本文实例讲述了thinkphp模板继承的实现方法.分享给大家供大家参考.具体实现方法如下: 模板的继承: 复制代码 代码如下: <block name='top'></block><!--这是父级模板--> <div style='border:1px solid gray;background:#abcdef;height:100px;'>广告部分</div> <block name='body'></block> &l

  • thinkPHP5框架渲染模板的3种方式简述

    本文实例讲述了thinkPHP5框架渲染模板的3种方式.分享给大家供大家参考,具体如下: 默认情况下,控制器的输出全部采用return的方式,无需进行任何的手动输出,系统会自动完成渲染内容的输出. 在控制器里渲染模板 namespace app\index\controller; use think\view; class Index{ public function index(){ $view = new view(); return $view->fetch('index'); } } 直

  • ThinkPHP模板之变量输出、自定义函数与判断语句用法

    本文实例讲述了ThinkPHP模板之变量输出.自定义函数与判断语句用法.主要包括变量输出.自定义函数与判断语句三种用法.分享给大家供大家参考.具体分析如下: 模板操作变量输出: 快捷输出变量 复制代码 代码如下: {:function(-)} //执行方法并输出返回值 {~function} //执行方法不输出 {@var} //输出Session变量 {#var} //输出Cookie变量 {&var} //输出配置参数  {%var} //输出语言变量 {.var} //输出GET变量 {^

  • 浅析ThinkPHP的模板输出功能

    ThinkPHP中的每一个xxxAction.class.php文件就代表着一个应用模块,这个Action中的每一个方法(function)代表着一个操作,操作可以分为有输出到模板的操作和只具执行不需要输出的操作. 打开Myapp/Lib/Action/IndexAction.class.php文件,我们可以看到里面的基础代码: class IndexAction extends Action{ public function index(){ } } 对此,需要指出一下几点: 1.在Think

  • thinkPHP5.0框架安装教程

    本文实例讲述了thinkPHP5.0框架安装方法.分享给大家供大家参考,具体如下: ThinkPHP5的环境要求如下: PHP >= 5.4.0 PDO PHP Extension MBstring PHP Extension CURL PHP Extension 严格来说,ThinkPHP无需安装过程,这里所说的安装其实就是把ThinkPHP框架放入WEB运行环境(前提是你的WEB运行环境已经OK),可以通过两种方式获取和安装ThinkPHP. 一.下载ThinkPHP安装 获取ThinkPH

  • ThinkPHP模板自定义标签使用方法

    使用模板标签可以让网站前台开发更加快速和简单,使用过dedecms.phpcms等内容管理系统的人应该都知道,cms的前台都是使用模板标签来调用数据.以调用文章列表为例: dedecms可以写成: <ul> {dede:arclist row='10' orderby='id desc' titlelen=''} <li>[field:title]</li> {/dede:arclist} </ul> phpcms可以写成: <ul> {pc:c

  • Thinkphp模板中截取字符串函数简介

    在php中截取字符串的函数有很多,而在thinkphp中也可以直接使用php的函数,本文给大家简单的介绍thinkPHP模板中截取字符串的具体用法,希望能对各位有所帮助. 对于英文字符可使用如下形式: 复制代码 代码如下: {$vo.title|substr=0,5} 如果是中文字符thinkphp提供了msubstr,用法如下: 复制代码 代码如下: function msubstr($str, $start=0, $length, $charset="utf-8″, $suffix=true

  • Thinkphp模板没有解析直接原样输出的解决方法

    本文实例讲述了Thinkphp模板没有解析直接原样输出的解决方法.分享给大家供大家参考.具体如下: 一.问题: 最近在学习thinkphp模板了,但是发现模板页原样出来了,经过一番艰苦搜索终于找到解决方案. 二.解决方法: 很多人都碰到相同问题,在变量中赋值的字符串中包含的__ROOT__.__PUBLIC__.__APP__,这种字符的, 在模板中display出来的时候都被替换成了真实路径.话说是在写Timi文件管理系统的时候发现的这个问题. 从文件中把源码读出来输出到页面后发现,只要是TP

  • thinkPHP5.0框架模块设计详解

    本文实例讲述了thinkPHP5.0框架模块设计.分享给大家供大家参考,具体如下: 5.0版本对模块的功能做了灵活设计,默认采用多模块的架构,并且支持单一模块设计,所有模块的命名空间均以app作为根命名空间(可配置更改). 目录结构 标准的应用和模块目录结构如下: ├─application           应用目录(可设置) │  ├─common             公共模块目录(可选) │  ├─common.php         公共函数文件 │  ├─route.php   

随机推荐