2011.12.27 - 开发日记 - Crude Framework开发框架
Posted on 2013-02-13 22:06 SnakeHunt2012 阅读(178) 评论(0) 收藏 举报本文始作于2011年12月27日,刊登于人人网,与2013年2月13日迁移至此
这次老段说我任务完成得不错,我老开心了。。。
第一个是请绘制一张Crude Framework处理一个请求的流程图,这个前几天刚做出来就发在日志上了。
第二个是请阅读lib/CPTemplate.class.php的代码,并简述该类的工作原理,我直接阅读了每一行代码,然后分别做了注释。代码如下:
<?php class CPTemplate { /* 设置$template_dir为全局变量 */ private $template_dir; /* 构造函数: 完成对输入$template_dir的格式化 */ function __construct($template_dir = './template/', $compile_dir = './compile/') { /* 删除$template_dir后面多余的字符, 并保证以一个反斜线为结尾 */ $this->template_dir = rtrim($template_dir, '/').'/'; } public function fetch($file_name, $data) { /* 如果输入的数据不是数组, 报错 */ if (!is_array($data)) return FALSE; /* 让$tpl_file为文件的绝对路径 */ $tpl_file = $this->template_dir.$file_name; /* 如果该文件不存在, 报错 */ if (!file_exists($tpl_file)) { return FALSE; } /******************************************** * 如果通过了上面两个检测, 就可以执行输出了 * * 他的返回值是引入的HTML源代码 * ********************************************/ return $this->sandbox($tpl_file, $data); } /* render: 驱动fetch */ public function render($file_name, $data = array()) { echo $this->fetch($file_name, $data); } private function sandbox($file, $data) { /************************************************************ * 打开缓冲 * * php 输出东西,会保存在一个 php 维护的内存里 * * 当这个 buffer 满了, php 会自动往 web server 发送这些数据 * ************************************************************/ ob_start(); /********************* * 为$file准备好变量 * * 将数组拆成变量 * * 键为变量名 * * 值为变量值 * *********************/ extract($data); /* 将$file代码输出 */ include($file); /* 缓冲区输出但输出之后不清空缓冲区, 并把内容存入$output */ $output = ob_get_contents(); /* 再丢弃缓冲区中的内容 */ ob_clean(); /* 返回$file的源代码 */ return $output; } }; 第三个是请阅读core/Dispatcher.class.php的代码,并简述该类的工作原理,也是代码注释给他交上去的: <?php class Dispatcher { private $routes; /* __construct: 构造函数 */ public function __construct($routes) { /* 将局部变量$routes赋给成员$routes */ $this->routes = $routes; } public function dispatch($uri) { global $session, $MSG; /* 对route.inc.php中$route的每个正则表达式进行匹配 */ foreach($this->routes as $pattern => $config) { /* 如果匹配成功 */ if(preg_match($pattern, $uri)) { /* 如果ACTION_ROOT . $config[1]存在 */ if(file_exists($config[1])) { /* 如果请求的Action的权限要求不是ROLE_ALL */ if(!in_array(ROLE_ALL,$config[2])) { /* 从对话中取出用户的信息存储在$user中 */ $user = $session->get('user'); /* 如果用户的权限不够 */ if(!in_array($user['usertype'] , $config[2])) { /* 报错返回 */ return $MSG['CODE_NOT_PERMITTED']; } } /* 如果通过了上面的权限检测, 就可以使用Action了 */ include_once($config[1]); /* $action_file_name存储所请求的Action的文件名(带后缀) */ $action_file_name = basename($config[1]); /* $action_class_name存储所请求的Action的文件名(不带后缀) */ $action_class_name = substr($action_file_name, 0, strpos($action_file_name, '.')); /* 如果所请求的Class文件存在 */ if(class_exists($action_class_name)){ /* 新实例$act, 所请求的Action */ $act = new $action_class_name(); /* 如果所请求的Action有execute方法 */ if(method_exists($act, 'execute')){ /* 添加权限认证 */ $act->execute(null); /* 返回succeess信息 */ return $MSG['CODE_SUCCESS']; }else{ /* 返回没有找到 */ return $MSG['CODE_NOT_VALID']; } }else{ /* 返回没有找到 */ return $MSG['CODE_NOT_VALID']; } }else{ /* 返回没有找到 */ return $MSG['CODE_NOT_VALID']; } } } /* 返回没有找到 */ return $MSG['CODE_NOT_FOUND']; } }; ?>
第四个是请指出至少一个Crude Framework可能存在的问题或者设计不当之处,由于实在是对框架了解太少,说不出什么真正的缺点,就寒暄式的跟他说了:“如果说不足的话,比如我仅请求一个非常简单的页面,但是经过Dispatcher.class.php复杂的处理就不必要了,而且加重了网络传输的负担。”。
浙公网安备 33010602011771号