PESCMS其中一个优点在于使用了PHP的命名空间,让整个程序文件加载变得简单利索。
若您不了解PHP的命名空间,请到PHP官网:《命名空间》进行自我充电
声明命名空间
整套程序中,控制器、模型和PESCMS提供的自带扩展库,必须在文件的开头声明了命名空间。
声明的方法非常简单:依据当前文件所在目录,在开头进行声明则可。如下文件:App/Home/GET/index.class.php
- <?php
- namespace App\Home\GET
- ...下面的业务代码省略...
使用命名空间是整套PESCMS的结构精髓所在,命名空间让我们加载文件变得非常简单。
反命名空间
什么是反命名空间?在声明了命名空间的环境下,若调用PHP本身提供的对象方法(或者PHP的扩展对象,引入第三方库文件的函数),可能会被当前文件的命名空间所覆盖。如下代码:
- <?php
- namespace Core\Db;
- class Mysql{
- public function __construct(){
- $dbh = new PDO();
- }
上述代码的作用为实例化PDO对象,受命名空间的影响,程序最终实例化的PDO对象时,文件加载会成为:Core/DB/PDO.class.php。因此,我们需要对PDO加上一个反斜杠声明,告知程序该对象不受本命名空间影响。
- <?php
- namespace Core\Db;
- class Mysql{
- public function __construct(){
- $dbh = new \PDO();
- }
若您的程序遇到加载错误的问题,不妨试下进行反命名空间。
发表于 2018-05-14
文件后缀命名
PESCMS的控制器、模型和自定义扩展库(不含第三库)的文件后缀命名均已: 文件名.class.php 形式记录。基于命名空间的文件自动加载机制,文件的后缀必须保持一致。因此请您务必确保上述文件的后缀命名,否则将出现文件加载失败的错误。
文件加载
自身文件
由于PESCMS的所有程序文件均是基于OOP的方法编写(即所有程序均是class),加上命名空间实现的自动加载机制,让我们调用控制器、模型、PESCMS官方扩展库变得非常简单。下面给出一些示例:
- //加载Index控制器,文件位于App/Home/GET目录。它的命名空间为: App\Home\GET
- $controller = new \App\Home\GET\Index();
- //加载ModelManag模型,文件位于Model目录。它的命名空间为:Model
- $list = \Model\ModelManag::modelList();
- //加载验证码扩展库,文件位于Expand目录。它的命名空间为:Expand
- $verify = new \Expand\Verify();
- //在任意目录(Test/ABCD/EFGH)下创建一个class test(){},文件命名为:test.class.php。他的命名空间为:Test\ABCD\EFGH
- $test = \Test\ABCD\EFGH\test();
是不是非常简单呢?原本应该调用require/include加载文件,现在变为更需要声明命名空间和类名则实现了加载!更重要的是,在任意地方创建的文件,只要按照PESCMS的文件后缀命名、声明命名文件所在的完整目录和代码是基于对象编写的,则完全可以平滑的实现自动加载。
关于为何不用use
可能有朋友觉得在实例化、调用方法前,不在文件头部使用use声明的待引入文件的命名空间做法存在不解。其实在早期的PESCMS版本,引入文件前,我都会再文件头部use需要加载文件的命名空间。可随着项目的深入开发,我发现出问题每次定位我都要拉文件到头部看一下该对象,方法所在的命名空间。一来一回,我调试的时间就被浪费在找use位置上面了。因此,后面我就做了调整,很少在文件头部使用use声明命名空间。
第三方库文件
加载第三方库,如EXCEL,PHPMailer。他们的命名规则并不符合PESCMS规则,并且未必使用上命名空间。更有甚者自身实现了一套自动加载文件规则。这个时候第三方库将无法使用PESCMS自动加载规则,并且产生了加载冲突。为此PESCMS给出临时屏蔽自身加载规则,调用第三方自动加载规则的方式。具体用法我们以编写适用于PESCMS的Excel类库的实例说明:
声明\Core\Func\CoreFunc::$defaultPath = false 后方可临时屏蔽PESCMS自动加载规则,然后使用require/include加载第三方库的核心文件。
- <?php
- namespace Expand\Excel;
- //声明为false,告知PESCMS在临时屏蔽自身的加载规则
- \Core\Func\CoreFunc::$defaultPath = false;
- //加载PHPExcel库的核心文件
- require_once PES_PATH . '/Expand/Excel/Classes/PHPExcel.php';
- class Excel {
- /**
- * 暴露EXCEL对象
- * 注意:不需要声明头部文件
- */
- public static function api() {
- //由于PHPExcel是对象,必须进行反命名空间,反正依旧会触发自动加载机制
- $objPHPExcel = new \PHPExcel();
- ...省略业务代码...
- }
- }
注:不是所有第三方库需要安装上面的做法进行。大家在开发过程,可以先尝试使用require/include方式加载并运行,出问题再尝试屏蔽PESCMS的自动加载方式。最终的解决方式请按照PESCMS的错误信息进行修正。