php框架实现原理,Ylmf-PHP框架基本原理
⼀、初始化过程
1、94hwan-PHP框架的⼊⼝点都是加载根⽬录的 init.php 来初始化的,因此在这⾥主要介绍⼀下初始化时到底做了⼀些什么。// 严格开发模式
error_reporting( E_ALL );
//开启register_globals会有诸多不安全可能性,因此强制要求关闭register_globals
if(ini_get('register_globals') )
{
exit('php.ini register_globals must is Off! ');
}
//核⼼库⽬录
define('CORE', dirname(__FILE__));
//系统配置
requireCORE.'/../config/inc_config.php';
//外部请求程序处理(路由)
requireCORE.'/req.php';
req::init();
//设置时区
date_default_timezone_set( $GLOBALS['config']['timezone_set'] );
//加载核⼼类库
requireCORE.'/util.php';
requireCORE.'/db.php';
requireCORE.'/tpl.php';
requireCORE.'/log.php';
requireCORE.'/cache.php';
//debug设置
$_debug_safe_ip= false;
requirePATH_LIBRARY.'/debug/lib_debug.php';
if( in_array( util::get_client_ip(),$GLOBALS['config']['safe_client_ip']) || OPEN_DEBUG === true )
{
$_debug_safe_ip= true;
ini_set('display_errors','On');
}
else
ini_set('display_errors','Off');
}
set_exception_handler('handler_debug_exception');
set_error_handler('handler_debug_error', E_ALL);
register_shutdown_function('handler_php_shutdown');
//session接⼝(使⽤session前需⾃⾏调⽤session_start)
requireCORE.'/session.php';
/**
* 程序结束后执⾏的动作
*/
functionhandler_php_shutdown()
{
show_debug_error();
log::save();
if( defined('CLS_CACHE') ) {
cache::free();
}
if( defined('CLS_CACHE_NATIVE') ) {
cls_cache_native::close();
}
}
/**
* 致命错误处理接⼝
* 系统发⽣致命错误后的提⽰
* (致命错误是指发⽣错误后要直接中断程序的错误,如数据库连接失败、不到控制器等) */
functionhandler_fatal_error($errtype,$msg)
{
global$_debug_safe_ip;
$log_str=$errtype.':'.$msg;
if( OPEN_DEBUG === true ||$_debug_safe_ip)
{
thrownewException($log_str);
else
{
log::add('fatal_error',$msg);
header ( "location:/404.html");
exit();
}
}
/**
* 路由控制
*
* @param $ctl 控制器
* @parem $ac 动作
* @return void
*/
functionrun_controller()
{
try
{
$ac= preg_replace("/[^0-9a-z_]/i",'', req::item('ac','index') ); $ac=emptyempty($ac) ?$ac='index':$ac;
$ctl='ctl_'.preg_replace("/[^0-9a-z_]/i",'', req::item('ct','index') ); $path_file= PATH_CONTROL .'/'.$ctl.'.php';
if(file_exists($path_file) )
{
require$path_file;
}
else
{
thrownewException ("Contrl {$ctl}--{$path_file} is not exists!"); }
if( method_exists ($ctl,$ac) === true )
{
$instance=new$ctl( );
$instance->$ac();
}
else
{
thrownewException ("Method {$ctl}::{$ac}() is not exists!");
}
}
catch ( Exception $e)
{
handler_fatal_error( 'init.php run_controller()',$e->getMessage().' url:'.util::get_cururl() );
}
}
/**
* ⾃动加载类库处理
* 加载优先级 /core/library => 应⽤⽬录/model => 根⽬录/model
* (如果不在这些位置, 则需⾃⾏⼿⼯加载,对于⼩型项⽬,也可以把model全放到library以减少类⽂件查时间) * @return void
*/
function__autoload($classname)
{
$classname= preg_replace("/[^0-9a-z_]/i",'',$classname);
if(class_exists($classname) ) {
returntrue;
}
$classfile=$classname.'.php';
try
{
if(file_exists( PATH_LIBRARY.'/'.$classfile) )
{
requirePATH_LIBRARY.'/'.$classfile;
}
elseif(file_exists( PATH_MODEL.'/'.$classfile) )
{
requirePATH_MODEL.'/'.$classfile;
}
elseif(file_exists(requirePATH_ROOT.'/model/'.$classfile) )
{
requirePATH_ROOT.'/model/'.$classfile;
}
else
{
returnfalse;
thrownewException ('Error: Cannot find the '.$classname);
}
}
catch ( Exception $e)
{
handler_fatal_error( 'init.php __autoload()',$e->getMessage().'|'.$classname.' url:'.util::get_cururl() );
}
}
/**
* req::item 别名函数
*/
functionrequest($key,$df='')
{
returnreq::item($key,$df);
}
说明⼀:新版框架最⼤的不同之处是,在引导⽂件⾥引⼊了重新封装过⼏个重要核⼼类,这些东西加起来,其实就是组成了最迷你的⼀个框架,但是功能少却基本完全兼顾,包括下⾯⼏个⽅⾯:
(1) 路由功能req.php:即是全局环境检查与请求参数初始化;
(2) 基本数据库类db.php:因为数据库类是最常⽤的的类,因此名称跳出规范的标准,直接使⽤db作为名称,更便于记忆;
(3) 视图类tpl.php:视图类是MVC框架⾥不可缺少的东西,本框架通过对smarty进⾏简化封装后,得到的 tpl 类,即是相当于别的框架的视图对应的功能;
(4) 缓存类cache.php:⽀持本地单⽂件hash缓存和memcache缓存,取代原来memcache + 打散⽂件的模式(这种模式缺点是时间长之后⽂件碎⽚极多,造成维护困难);
(5) ⽇志类log.php:⽬前仅进⾏了简单的规范;
(6) 调试程序debug/lib_debug.php:引导⽂件中定义了debug的⽅案并且定义了register_shutdown_function接⼝。
php文件管理系统mvc 源码(7) session(sesion.php):重写了session接⼝,确保在各种场合下都可以使⽤session。
(8) 引导功能:定义了如何引导到控制器和加载类库路径(un_controller、__autoload)。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论