/首页
/开源
/关于
php标准之PSR4与自动加载以及命名空间
发表@2018-09-13 09:15:21
更新@2023-01-21 22:47:40
###### 现代php的开发方式与n年前大不相同 , 体会不到的仁兄去接触一下Laravel框架 , 可领略一下现代php开发的人情风土 . ###### 提四个关键字 , 这便是本文的要点 , 同时也是现代php开发所包含的 . ###### 1 : php-fig , 即PHP Framework Interoperability Group , 中文为PHP互操作性框架指定小组 . 严格意义来说 , 倒也不是php官方的组织 , 算是个草根组织 . 这是他们的官网 [php-fig](http://www.php-fig.org "php-fig") . ###### 2 : PSR , 即Proposing a Standards Recommendation , 以本人翻译水准 , 暂时翻译为"提出的一个标准建议" . 其实就是对于php开发者在开发过程中提出一些标准规范 , 非强制性的 , 所以可以不遵守 . 目前 , 开发者们常用的php-fig标准入下表格所示 | 名称 | 简介 | | ------------ | ------------ | | PSR-0 | 已废弃 | | PSR-1 | 基本代码规范 | | PSR-2 | 代码风格规范 | | PSR-3 | 日志接口规范 | | PSR-4 | 自动加载 | ###### 如果你想查看关于更多更详细的标准描述 , [点击我深入了解PSR](http://www.php-fig.org/psr/ "点击我深入了解PSR") . 其实 , 今天重点说的是PSR-4 , 也就是自动加载 . 可以说 , PSR4是composer出现的基石 . ###### 3 . 自动加载 , 众所周知 , php中有个大名鼎鼎的魔法函数__autoload() , 该函数使用方法如下 : ```php ``` ###### 有人会问 , 如果我这里需要php文件存在于多个不同的目录怎么办 ? 有很多解决方案 , 演示几个常用的解决方案演示 : ```php './model/user.php', 'userLib' => './lib/user.php', ); function __autoload( $classname ){ if( isset( $arr[ $classname ] ) ){ require_once $arr[$classname]; } } ?> ``` ###### 但是 , __autoload依然有个巨大的缺陷 , 就是无法加载多个autoload方法 . 什么意思 ? 举个例子 , 假如你的php库代码的自动加载方案是A , 然而后来你要引入另外一套库文件 , 而这套库文件则采用的是另外一种加载方案 . 那么 , 难题就来了 ... ... ###### 解决这个问题的方案是 : spl_autoload_register()函数 , 该函数可以注册多个autoload方法 . 该函数的具体说明 [点击这里](http://php.net/manual/zh/function.spl-autoload-register.php "点击这里") . 该函数可以注册多个autoload方法 . 代码如下 : ```php ``` ###### 以上代码运行后 , 我们可以看到除了报错Class user not found外 , 还依次显示了三段文本 auotload 1 , autoload 2 , autoload 3 . 也就是说 , 我们可以同时注册三种不同自动加载机制 . ###### 4 . 命名空间 , 即namespace , 是php 5.3以后引入的新特性 , 用来解决包名冲突问题的 . 这里不对namespace做详细用法解释 , 如果想查看详细用法概述的[点击这里](http://www.php.net/manual/zh/language.namespaces.php "点击这里") . 为什么要在这里提这个看起来与文章内容毫不相干的要点呢 ? 因为在现代php开发中 , 命名空间是"新一代自动加载机制"的基石 . "新的自动加载"机制就是利用了命名空间做为文件目录分割 , 从而定位到文件所在地并加载文件 . 假如我们有如下项目 : ![](https://ti-node.com/static/upload/6343739525134548993) ###### Lib文件夹是常用的库 , Model是类所在目录 , index.php是唯一入口文件 . ###### Mysql.php问加内容如下 : ```php login(); // 加载初始化Mysql类 $mysql = new Lib\Mysql(); $mysql->connect(); ``` ###### 可以注意到 , User.php开头的namespace Model和Mysql.php开头的namespace Lib ( namespace只能用在一个php的第一行 ) . 命名空间就对应了文件夹目录的层次关系 . 当然这并不是官方的规定 , 而是人们利用命名空间做出的一种规范 , 为了方便开发和协调 . ###### 收尾总结 : PSR4就是这样一种标准 , 它利用了命名空间和spl_autoload_register()在php-fig的倡导下形成的一种开发者约定俗成的开发标准和规则 . 只要开发者开发的库满足PSR系列的标准 , 那么这个库就可以在任意一个支持PSR标准的任意框架或项目中运行 , 最终诞生了伟大的php composer .