这里我直接上代码:

/**
* 框架核心
*/
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,这里存放一些配置文件及后台设置等,有利于我们提取

从零开始写自己的PHP框架系列教程(一)[core.php]的更多相关文章

  1. 从零开始写自己的PHP框架系列教程[前言]

    我觉得程序员进步的理由:多看->多写->多总结 我自我介绍下,我不是程序员,但是我爱编程,作为业余程序员自己写框架让人感到兴奋的,目前有很多框架(js有jQuery.Express.soc ...

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

    从这一个文件开始以后加载的均以类加载,请注意命名空间和所在文件的路径 APP.php的这个类所在路径:根目录\framework\App.php 直接上代码 namespace framework; ...

  3. 老周的ABP框架系列教程 -》 一、框架理论初步学习

    老周的ABP框架系列教程 -- 一.框架理论初步学习   1. ABP框架的来源与作用简介 1.1  简介 1.1.1       ABP框架全称为"ASP.NET Boilerplate ...

  4. 从零开始编写自己的C#框架 ---- 系列文章

    目录: 从零开始编写自己的C#框架(1)——前言从零开始编写自己的C#框架(2)——开发前的准备工作从零开始编写自己的C#框架(3)——开发规范从零开始编写自己的C#框架(4)——文档编写说明从零开始 ...

  5. Famous框架系列一:famous/core/Surface

    famous/core/Surface 既然是Famous的第一篇文章,就先给Famous打个广告:http://periodic.famo.us  Famous12年的作品,点击右下角Fun thi ...

  6. 一起学习造轮子(三):从零开始写一个React-Redux

    本文是一起学习造轮子系列的第三篇,本篇我们将从零开始写一个React-Redux,本系列文章将会选取一些前端比较经典的轮子进行源码分析,并且从零开始逐步实现,本系列将会学习Promises/A+,Re ...

  7. 一步一步使用ABP框架搭建正式项目系列教程之本地化详解

    返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 本篇目录 扯扯本地化 ABP中的本地化 小结 扯扯本地化 本节来说说本地化,也有叫国际化.全球化的,不管怎么个叫法,反正道理都是一 ...

  8. 读《架构探险——从零开始写Java Web框架》

    内容提要 <架构探险--从零开始写Java Web框架>首先从一个简单的 Web 应用开始,让读者学会如何使用 IDEA.Maven.Git 等开发工具搭建 Java Web 应用:接着通 ...

  9. 前端测试框架Jest系列教程 -- 简介

    写在前面: 随着互联网日新月异的发展,用户对于页面的美观度,流畅度以及各方面的体验有了更高的要求,我们的网页不再是简单的承载文字,图片等简单的信息传递给用户,我们需要的是更加美观的页面展示,更快的浏览 ...

随机推荐

  1. Linux三种网络连接模式

    https://www.cnblogs.com/linjiaxin/p/6476480.html 三种模式的区别:https://www.cnblogs.com/itxiaok/p/10358055. ...

  2. Vue+Element-ui+DateTimePicker 日期时间选择器传值给后台

                废话不多说,看代码: <template> <div class="block"> <span class="dem ...

  3. 找到多个与名为“Home”的控制器匹配的类型

    “/”应用程序中的服务器错误. 找到多个与名为“Home”的控制器匹配的类型.如果为此请求(“{controller}/{action}/{id}”)提供服务的路由没有指定命名空间以搜索与此请求相匹配 ...

  4. python线程condition条件锁应用实例

    import time import threading # 吃火锅鱼丸 guo = [] suo = threading.Condition() #条件锁 # 生产者负责生产 class Produ ...

  5. ajax 提交数组 泛型集合

    ajax 提交数组 泛型集合 发表于2015/12/31 14:26:29  5117人阅读 分类: mvc asp.net webapi ORM 转载:http://blog.csdn.net/li ...

  6. Sed练习

    sed:编辑器 sed:Stream EDitor,行编辑器 用法:        sed [opthon]... ‘script’ inputfile.. scritp:‘地址命令’ 常用选项:   ...

  7. python数据结构与算法之问题求解实例

    关于问题求解,书中有一个实际的案例. 上图是一个交叉路口的模型,现在问题是,怎么安排红绿灯才可以保证相应的行驶路线互不交错. 第一步,就是把问题弄清楚. 怎么能让每一条行驶路线不冲突呢? 其实,就是给 ...

  8. db2常用语句

    连接数据库 db2 connect to chmgmdb user ch_mgm 断开数据库 db2 disconnect current 查询 db2 "select * from btp ...

  9. 网络编程-day4

    #服务端 import socketserver class Myserver(socketserver.BaseRequestHandler): def handle(self): while 1: ...

  10. vi编辑器和系统分区

    作业一:1) 将用户信息数据库文件和组信息数据库文件纵向合并为一个文件/1.txt(覆盖) cat /etc/passwd /etc/group > /1.txt2) 将用户信息数据库文件和用户 ...