命名空间与文件加载

目录

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();
    }

若您的程序遇到加载错误的问题,不妨试下进行反命名空间。

文件后缀命名

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的错误信息进行修正。

PESCMS DOC 文档系统
© Copyright 2015-2020. by the PESCMS DOC
耗时0.0198秒