BroPHP框架阅读笔记
Ps:乡下过年回来神清气爽啊~~闲得蛋疼看看简单的框架实现。另外也有个小小的计划了先….任何问题请轻拍。
第一遍站在开发的角度来读,主要是看功能如何实现。
第二遍站在安全的角度来读,主要是发现这样的写法有何不安全又有何好处。
当前进行:
*akcms
*kiwiphp(号称门户级的框架 –-)
计划中的:
1.Discuz(大型论坛)
2.phpbb(轻量级论坛)
3.Wordpress(传统PHP写法的Blog)
4.ThinkPHP(MVC轻量级框架的实现方式)
======================================开始-蛋疼的分割线======================================
目录结构:
│ index.php
│
└─brophp
│ brophp.php
│
├─bases — 核心类
│
├─classes — 常用方法类
│
├─commons
│ functions.inc.php
│ success
│
└─libs —smarty类
———————————————————————————————–
Index.php:
define(“BROPHP”, “./brophp”); //框架源文件的位置
define(“APP”, “./”); //设置当前应用的目录
require(BROPHP.’/brophp.php’); //加载框架的入口文件
一个单一入口,几乎所有的框架都是这么搞貌似,至少thinkphp是这么来的。
———————————————————————————————–
brophp.php:
header(“Content-Type:text/html;charset=utf-8″); //设置系统的输出字符为utf-8
date_default_timezone_set(“PRC”); //设置时区(中国)
/* 这里没啥好说的,设定编码和市区*/
define(“BROPHP_PATH”, rtrim(BROPHP, ‘/’).’/'); //BroPHP框架的路径
define(“APP_PATH”, rtrim(APP,’/').’/'); //用户项目的应用路径
define(“PROJECT_PATH”, dirname(BROPHP_PATH).’/'); //项目的根路径,也就是框架所在的目录
define(“TMPPATH”, str_replace(array(“.”, “/”), “_”, ltrim($_SERVER["SCRIPT_NAME"], ‘/’)).”/”);
//script_name = /brophp/index.php
//包含系统配置文件
$config=PROJECT_PATH.”config.inc.php”;
if(file_exists($config)){
include $config;
}
//存在config.inc.php就包含,框架第一次运行会自动创建项目所需要的文件。
//设置Debug模式
if(defined(“DEBUG”) && DEBUG==1){
$GLOBALS["debug"]=1; //初例化开启debug
error_reporting(E_ALL ^ E_NOTICE); //输出除了注意的所有错误报告
include BROPHP_PATH.”bases/debug.class.php”; //包含debug类
Debug::start(); //开启脚本计算时间
set_error_handler(array(“Debug”, ‘Catcher’)); //设置捕获系统异常
}else{
ini_set(‘display_errors’, ‘Off’); //屏蔽错误输出
ini_set(‘log_errors’, ‘On’); //开启错误日志,将错误报告写入到日志中
ini_set(‘error_log’, PROJECT_PATH.’runtime/error_log’); //指定错误日志文件
}
/* 设定调试的相关信息 注释也很详细了*/
//包含框架中的函数库文件
include BROPHP_PATH.’commons/functions.inc.php’;
//包含全局的函数库文件,用户可以自己定义函数在这个文件中
$funfile=PROJECT_PATH.”commons/functions.inc.php”;
if(file_exists($funfile))
include $funfile;
/* 如果项目中存在的话,就会包括commons/functions.inc.php 结合第一次自动创建项目文件,您懂得*/
//设置包含目录(类所在的全部目录), PATH_SEPARATOR 分隔符号Linux(:) Windows(;)
$include_path=get_include_path(); //原基目录
$include_path.=PATH_SEPARATOR.BROPHP_PATH.”bases/”; //框架中基类所在的目录
$include_path.=PATH_SEPARATOR.BROPHP_PATH.”classes/”; //框架中扩展类的目录
$include_path.=PATH_SEPARATOR.BROPHP_PATH.”libs/”; //模板Smarty所在的目录
$include_path.=PATH_SEPARATOR.PROJECT_PATH.”classes/”; //项目中用的到的工具类
$controlerpath=PROJECT_PATH.”runtime/controls/”.TMPPATH; //生成控制器所在的路径
$include_path.=PATH_SEPARATOR.$controlerpath; //当前应用的控制类所在的目录
/* get_include_path为PHP函数,此处就是框架所在目录了,加上分隔符放到$include_path变量中*/
set_include_path($include_path);
/* 包含前面所有的文件,见PHP手册代码:
$path = ‘/usr/lib/pear’;
set_include_path(get_include_path() . PATH_SEPARATOR . $path);
*/
//自动加载类
function __autoload($className){
if($className==”memcache”){ //如果是系统的Memcache类则不包含
return;
}else if($className==”Smarty”){ //如果类名是Smarty类,则直接包含
include “Smarty.class.php”;
}else{ //如果是其他类,将类名转为小写
include strtolower($className).”.class.php”;
}
Debug::addmsg(“<b> $className </b>类”, 1); //在debug中显示自动包含的类
}
/* 然后用__autoload魔术函数自动按类名加载类,如果加载错误的话会利用debug类来输出加载错误的类文件*/
//判断是否开启了页面静态化缓存
if(CSTART==0){
Debug::addmsg(“<font color=’red’>没有开启页面缓存!</font>(但可以使用)”);
}else{
Debug::addmsg(“开启页面缓存,实现页面静态化!”);
}
//启用memcache缓存
if(!empty($memServers)){
//判断memcache控制是否安装
if(class_exists(“memcache”)){
$mem=new MemcacheModel($mem
补充:综合编程 , 安全编程 ,