thinkphp5.0命名空间

摘要:
命名空间ThinkPHP使用命名空间定义和自动加载类库文件,有效解决了多个模块和Composer类库之间的命名空间冲突,并为类库实现了更高效的自动加载机制。系统的几个内置根命名空间(类库包)如下所示:名称描述类库目录thinkphp/library/thattraits system trait类库thinkphp-library/tritsapp application如果需要添加新的根命名空间,有两种方法:注册新的根名称空间或将其放入EXTEND_PATH目录。

命名空间

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

如果不清楚命名空间的基本概念,可以参考PHP手册:PHP命名空间

特别注意的是,如果你需要调用PHP内置的类库,或者第三方没有使用命名空间的类库,记得在实例化类库的时候加上 ,例如:

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

在ThinkPHP5.0中,只需要给类库正确定义所在的命名空间,并且命名空间的路径与类库文件的目录一致,那么就可以实现类的自动加载,从而实现真正的惰性加载。

例如, hinkcachedriverFile类的定义为:

namespace thinkcachedriver;

class File 
{
}

如果我们实例化该类的话,应该是:

$class = new 	hinkcachedriverFile();

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

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

原则上,可以支持驼峰法命名的目录,只要命名空间定义和目录一致即可,例如:

我们实例化

$class = new ThinkCacheDriverFile();

系统则会自动加载 thinkphp/library/Think/Cache/Driver/File.php文件。

根命名空间(类库包)

根命名空间是一个关键的概念,以上面的 hinkcachedriverFile类为例,think就是一个根命名空间,其对应的初始命名空间目录就是系统的类库目录(thinkphp/library/think),我们可以简单的理解一个根命名空间对应了一个类库包。

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

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

如果需要增加新的根命名空间,有两种方式:注册新的根命名空间或者放入EXTEND_PATH目录(自动注册)。

请注意本手册中的示例代码为了简洁,如无指定类库的命名空间的话,都表示指的是think命名空间,例如下面的代码:

Route::get('hello','index/hello');

请自行使用 use thinkRoute或者

thinkRoute::get('hello','index/hello');

自动注册

我们只需要把自己的类库包目录放入EXTEND_PATH目录(extend,可配置),就可以自动注册对应的命名空间,例如:

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

namespace my;

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

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

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

如果我们在应用入口文件中重新定义了EXTEND_PATH常量的话,还可以改变myTest类文件的位置,例如:

define('EXTEND_PATH','../vendor/');

那么myTest类文件的位置就变成了/vendor/my/File.php

手动注册

也可以通过手动注册的方式注册新的根命名空间,例如:

在应用入口文件中添加下面的代码:

thinkLoader::addNamespace('my','../application/extend/my/');

如果要同时注册多个根命名空间,可以使用:

thinkLoader::addNamespace([
    'my'  => '../application/extend/my/',
    'org' => '../application/extend/org/',
]);

也可以直接在应用的配置文件中添加配置,系统会在应用执行的时候自动注册。

'root_namespace' => [
    'my'  => '../application/extend/my/',
    'org' => '../application/extend/org/',
]

应用类库包

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

namespace appindexmodel;

class User extends 	hinkModel
{
}

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

namespace appadminEvent;
class User 
{
}

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

如果觉得app根命名空间不合适或者有冲突,可以在应用配置文件中修改:

'app_namespace' =>  'application',

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

namespace applicationindexmodel;

class User extends 	hinkModel
{
}

命名空间别名

框架允许给命名空间定义别名,例如:

namespace appindexmodel;

use thinkModel;

class User extends Model
{
}

原来在控制器里面调用方式为:

namespace appindexcontroller;

use appindexmodelUser;

class Index
{
    public function index()
    {
        $user = new User();
    }
}

如果我们在应用公共文件中注册命名空间别名如下:

thinkLoader::addNamespaceAlias('model','appindexmodel');

那么,上面的控制器代码就可以更改为:

namespace appindexcontroller;

use modelUser;

class Index
{
    public function index()
    {
        $user = new User();
    }
}

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

免责声明:文章转载自《thinkphp5.0命名空间》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Adobe SVG View 动态修改src的问题shell脚本入门基础-1下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

命名空间详解和分类

命名空间是什么 计算机科学领域中是通过名字来使用各种代码资源(变量和子程序)的,命名空间(namespace)则是组织这些资源的一组符号,例如目录树是就硬盘上文件们的命名空间。命名空间的设计目的是提供一种让一组名称与其他名称分隔开的方式。在一个命名空间中声明的类的名称与另一个命名空间中声明的相同的类的名称不冲突。 如果你还是无法获得命名空间的概念,你只要想...

php自动加载规范 PSR4 (Thinkphp)

PSR4是一种自动加载规范,老版本是PSR0,尽管thinkPHP支持PSR4和PSR0的自动加载方式,但是默认也是优先进行PSR4加载,如果失败,再进行PSR0的加载。本篇文章只会讨论PSR4的加载。 代码示例: spl_autoload_register(function ($class) { // 指定项目的命名空间前缀 $p...

留言板小程序开发笔记-4

前端多个html文件, 共用变量的时候, 使用cookie, 或者在多个页面之间通过 url传递变量... 前端多个html页面之间, 可以共用一个css文件, 因为, 在不同的页面包含同一个css文件, 即使另一个页面,不包含某些 dom节点的时候, 它不会出错, 而且也会自动执行. 而多个html文件,共用一个 js 文件时, 由于不同文档的dom结...

tp5.1自动加载机制

前言     最近在学习TP5.1.37 框架内核,想把自己所学到的写下来,这样可以检测自己到底学到了多少,理解了多少。写的有不对的地方或者有不严谨的地方,还望大佬指正,谢谢。 正文 index.php 入口文件引入自动加载类Loader     TP5.1入口文件引入加载了base.php文件,然后base.php文件中载入了Loader.php类,并且...

thinkphp5.0自动加载

概述 ThinkPHP5.0 真正实现了按需加载,所有类库采用自动加载机制,并且支持类库映射和composer类库的自动加载。 自动加载的实现由thinkLoader类库完成,自动加载规范符合PHP的PSR-4。 自动加载 由于新版ThinkPHP完全采用了命名空间的特性,因此只需要给类库正确定义所在的命名空间,而命名空间的路径与类库文件的目录一致,那么就...

PHP 命名空间

概述 什么是命名空间呢? 这个概念我第一次知道是在C++中. 首先, 为什么要用到命名空间呢? 当然是为了解决重名的问题了, 其实命名空间和Java中的包有着异曲同工之妙, Java中 a包下的Test类, 和b包下的Test类是两个类, 在使用的时候import不同包下即可, PHP中 a命名空间下的Test类,与b命名空间下的Test类也是两个类.  ...