PHPCMS源码分析(二)

index.php中引入了phpcms框架的入口文件,下面我们看下这个入口文件 /phpcms/base.phpdefine('IN_PHPCMS', t

index.php中引入了phpcms框架的入口文件,下面我们看下这个入口文件

 

/phpcms/base.php

define('IN_PHPCMS', true);//防止恶意调用
                                                          
//PHPCMS框架路径
define('PC_PATH', dirname(__FILE__).DIRECTORY_SEPARATOR);         
//重新定义网站根目录
if(!defined('PHPCMS_PATH')) define('PHPCMS_PATH', PC_PATH.'..'.DIRECTORY_SEPARATOR);
                                                          
//缓存文件夹地址
define('CACHE_PATH', PHPCMS_PATH.'caches'.DIRECTORY_SEPARATOR);
//主机协议
define('SITE_PROTOCOL', isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://');
//当前访问的主机名
define('SITE_URL', (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ''));
//来源
define('HTTP_REFERER', isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '');
                                                          
//系统开始时间
define('SYS_START_TIME', microtime());

 

以上这段代码主要定义了一些常量,不做过多解释。下面我们来看看公共函数库的加载。

//加载公用函数库
pc_base::load_sys_func('global');
pc_base::load_sys_func('extention');
pc_base::auto_load_func();

 

利用pc_base中的静态方法来调用函数库。具体的实现方法如下:

/**
 * 加载系统的函数库
 * @param string $func 函数库名
 */
public static function load_sys_func($func) {
    return self::_load_func($func);
}
                             
/**
 * 加载函数库
 * @param string $func 函数库名
 * @param string $path 地址
 */
private static function _load_func($func, $path = '') {
    static $funcs = array();
    if (empty($path)) $path = 'libs'.DIRECTORY_SEPARATOR.'functions';
    $path .= DIRECTORY_SEPARATOR.$func.'.func.php';
    $key = md5($path);
    if (isset($funcs[$key])) return true;
    if (file_exists(PC_PATH.$path)) {
        include PC_PATH.$path;
    } else {
        $funcs[$key] = false;
        return false;
    }
    $funcs[$key] = true;
    return true;
}

 

以上函数的调用方法值得学习的地方是函数的加载方式。把函数加载进来之后放入到静态变量$funcs这个数组中,在下次调用时就不需要到文件中重新调用,而是直接在内存中调用就可以了。

/**
 * 自动加载autoload目录下函数库
 * @param string $func 函数库名
 */
public static function auto_load_func($path='') {
    return self::_auto_load_func($path);
}
/**
 * 加载函数库
 * @param string $func 函数库名
 * @param string $path 地址
 */
private static function _auto_load_func($path = '') {
    if (empty($path)) $path = 'libs'.DIRECTORY_SEPARATOR.'functions'.DIRECTORY_SEPARATOR.'autoload';
    $path .= DIRECTORY_SEPARATOR.'*.func.php';
    $auto_funcs = glob(PC_PATH.DIRECTORY_SEPARATOR.$path);
    if(!empty($auto_funcs) && is_array($auto_funcs)) {
        foreach($auto_funcs as $func_path) {
            include $func_path;
        }
    }
}

 

以上代码是需要自动加载的函数库的加载方法,可以学习的是利用glob()函数加载'lib/functions/autoload/'目录下的所有函数文件。

标签: 加载