从零开始写自己的PHP框架系列教程(一)[core.php]

这里我直接上代码:

/**
 * 框架核心
 */
if (version_compare(PHP_VERSION, '5.3.0','<')) {
    header("Content-Type: text/html; charset=UTF-8");
    echo 'PHP环境不能低于5.3.0';
    exit;
}

/**
 * 框架路径核心定义
 */
if( !defined('ROOT_PATH') ) define('ROOT_PATH', realpath('./').DIRECTORY_SEPARATOR);
if( !defined('CONFIG_PATH') ) define('CONFIG_PATH', ROOT_PATH.'data/config/');
if( !defined('ROOT_URL') ) define('ROOT_URL',  rtrim(dirname($_SERVER["SCRIPT_NAME"]), '\\/').'/');
if( !defined('PUBLIC_URL') ) define('PUBLIC_URL', ROOT_URL . 'statics/');

/**
 * 设置公共变量 $_W 包含大量模块之间的配置信息
 */
$_W=array();
use framework\Config;
use framework\Route;
use framework\App;


/**
 * 系统函数:获取设置配置
 * @param  string $key   配置项
 * @param  mixed  $value 配置值
 * @return array
 */
function config($key = NULL, $value = NULL){
    if( func_num_args() <= 1 ){
        return Config::get($key);
    }else{
        return Config::set($key, $value);
    }
}

/**
 * 系统函数:URL生成
 * @param  string $route  地址
 * @param  array  $params 参数
 * @return string
 */
function url($route = null, $params = array()){
    return Route::url($route, $params);
}

/**
 * 系统函数:对象调用函数
 * 
 * @param  string $class 模块名/类名
 * @param  string $layer 模块层
 * @return object
 */
function obj($class, $layer = 'model'){
    static $objArr = array();

    $param = explode('/', $class, 2);
    $paramCount = count($param);
    switch ($paramCount) {
        case 1:
            $app = APP_NAME;
            $module = $param[0];
            break;
        case 2:
            $app = $param[0];
            $module = $param[1];
            break;
    }

    $app = strtolower($app);

    

    $class = "\\{$app}\\{$module}";
    
    if(!class_exists($class)){
        $class = "\\app\\{$app}\\{$layer}\\{$module}".ucfirst($layer);;
    }
    
    if(isset($objArr[$class])){
        return $objArr[$class];
    }
    
    if(!class_exists($class)){
        throw new \Exception("Class '{$class}' not found'", 500);
    }

    $obj = new $class();
    $objArr[$class] = $obj;
    return $obj;
}

/**
 * 系统函数:自动加载类
 * @param  string $class 模块名/类名
 * @param  string $layer 模块层
 * @return object
 */
function auto_load($class) {
    static $fileList = array();
    $prefixes =array(
        'framework' => realpath(__DIR__.'/../').DIRECTORY_SEPARATOR,
        'controller'=>realpath(__DIR__).'/../extend'.DIRECTORY_SEPARATOR,
        'model'=>realpath(__DIR__).'/../extend'.DIRECTORY_SEPARATOR,
        'hook'=>realpath(__DIR__).'/../extend'.DIRECTORY_SEPARATOR,
        'admin' => ROOT_PATH,
        '*' => ROOT_PATH,
        
    );
    
    $class = ltrim($class, '\\');
    if (false !== ($pos = strrpos($class, '\\')) ){
        $namespace = substr($class, 0, $pos);
        $className = substr($class, $pos + 1);
        
        //循环自动加载的目录
        foreach ($prefixes as $prefix => $baseDir){
            if ( '*'!==$prefix && 0!==strpos($namespace, $prefix) ) continue;

            //根据namespace分割路径和文件名字
            $fileDIR = $baseDir.str_replace('\\', DIRECTORY_SEPARATOR, $namespace).DIRECTORY_SEPARATOR;
        
            if( !isset($fileList[$fileDIR]) ){
                $fileList[$fileDIR] = array();
                foreach(glob($fileDIR.'*.php') as $file){
                    $fileList[$fileDIR][] = $file;
                }
            }
            
            $fileBase = $baseDir.str_replace('\\', DIRECTORY_SEPARATOR, $namespace).DIRECTORY_SEPARATOR.$className;
            foreach($fileList[$fileDIR] as $file){
                if( false!==stripos($file, $fileBase) ){
                    require $file;
                    return true;                
                }
            }                            
        }           
    }
    return false;
}

spl_autoload_register('auto_load');
App::run();

框架的核心我定义了一个全局变量数组$_W,这里存放一些配置文件及后台设置等,有利于我们提取

posted @ 2017-10-21 19:26  一碗范特西  阅读(314)  评论(0编辑  收藏  举报