php框架
来源:互联网 发布:流程图软件visio下载 编辑:程序博客网 时间:2024/05/15 16:43
从零开始搭建php框架
.htaccess文件 ‘/.htaccess’
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]</IfModule>
入口文件 /index.php
<?php// 整个框架所在的根目录define ('UEK', realpath('./'));// 核心类所有在目录define ('CORE', UEK.'/core');// APP开发目录define ('APP', UEK.'/app');// 是否开启调试模式define ('DEBUG', true);if( DEBUG ){ ini_set('display_errors', 'On');}else{ ini_set('display_errors', 'Off');}// 引入公共函数库include CORE . '/common/function.php';// 引入框架核心类include CORE . '/uek.php';// 如果new一个不存在的类,则调用\core\uek类中的load方法spl_autoload_register('\core\uek::load');// 调用uek类中的run方法启动整个框架\core\uek::run();
公共函数库 /core/common/function.php
<?phpfunction p($var){ if( is_bool($var) ){ var_dump($var); }else if( is_null ($var) ){ var_dump($var); }else{ echo '<pre>' . print_r($var, true) . '</pre>'; }}
框架核心类 /core/uek.php
<?phpnamespace core;class uek{ // 缓存已经加载过的类 public static $class_map = array(); // 保存要输出到视图中的变量 public $assign; // 框架启动方法 调用路由类管理路由 static public function run() { // 当前并没有include route类文件 会触发spl_autoload_register() 函数中指定的方法 // 也就是本类中的 load() 方法 // spl_autoload_register函数会把 \core\lib\route 作为字符串传递给load() $route = new \core\lib\route(); $controller_class = $route->controller; $action = $route->action; // 根据路由规则找到app下对应的类文件, 根据路由规则运行其中的方法 $controller_file = APP . '/controller/' . $controller_class . 'Controller.php'; if( is_file($controller_file) ){ include $controller_file; $class_name = '\\app\\controller\\'.$controller_class.'Controller'; $controller = new $class_name(); $controller->$action(); }else{ throw new \Exception("can't find module"); } } // 自动加载一个类文件 public static function load($class) { // 存在于缓存中 if( isset($class_map[$class])){ return true; }else{ // 根据命名空间规则找到对应的类文件 $file = UEK . '/' . str_replace('\\', '/', $class) . '.php'; if( is_file($file) ){ include $file; // 如果已经include过,利用类名做一次缓存 self::$class_map[$class] = $class; }else{ return false; } } } public function assign($name, $value) { $this->assign[$name] = $value; } public function display($file) { $view_path = APP . '/' . $file; if(is_file($view_path)){ extract($this->assign); include($view_path); } }}
框架路由类 /core/lib/route.php
<?phpnamespace core\lib;class route{ public $controller; public $action; // new 本类时会自动运行的方法 public function __constructor() { // 根据用户访问的路径确定调用APP下哪个php文件中的哪个方法 // 这里返回的只是$controller的名字和对应方法的名字 // 这里还要处理用户的get传参 if( isset( $_SERVER['REQUEST_URI'] ) && $_SERVER['REQUEST_URI'] !== '/' ){ $path = $_SERVER['REQUEST_URI']; $params = explode('/', trim($path, '/')); if(isset($params[0])){ $this->controller = $params[0]; unset($params[0]); } if(isset($params[1])){ $this->action = $params[1]; unset($params[1]); }else{ $this->action = 'index'; } // 将多余的参数收入$_GET // index/index/id/1/str/2/test/3 for ($i = 2; $i < count($params) + 2; $i += 2) { if (isset($params[$i + 1])) { $_GET[$params[$i]] = $params[$i + 1]; } } }else{ // 用户访问 / 时候默认调用app下的 indexController.php 下的 index() 方法 $this->controller = 'index'; $this->action = 'index'; } }}
框架model类 利用pdo实现连接数据库 /core/lib/model.php
<?phpnamespace core\lib;class model extends \PDO{ public function __construct() { $database_info = 'mysql:host=localhost;dbname=yarn'; $username = 'root'; $password = 'root'; try{ parent::__construct($database_info, $username, $password); } catch (\PDOException $e){ p($e->getMessage()); } }}
用户首页类 /app/controller/indexController.php
<?phpnamespace app\controller;// 继承框架核心文件// 利用核心文件中的 assign 和 display 方法来管理视图class indexController extends \core\uek{ public function index() { $model = new \core\lib\model(); $sql = 'select * from todos'; $result = $model->query($sql); p($result->fetchAll()); p($_GET); $this->assign('data','hello world'); $this->assign('title','facebook'); $this->display('view/index.html'); }}
用户视图文件 ‘/app/view/index.html’
<html><head> <meta charset='utf-8'> <title><?php echo $title ?></title></head><body> <div><?php echo $data ?></div></body></html>
db文件
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";SET time_zone = "+00:00";---- Database: `yarn`--CREATE DATABASE IF NOT EXISTS `yarn` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;USE `yarn`;-- ------------------------------------------------------------ 表的结构 `todos`--DROP TABLE IF EXISTS `todos`;CREATE TABLE IF NOT EXISTS `todos` ( `id` int(12) NOT NULL, `title` varchar(255) NOT NULL, `is_done` tinyint(1) NOT NULL, `is_del` tinyint(1) NOT NULL) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;---- 转存表中的数据 `todos`--INSERT INTO `todos` (`id`, `title`, `is_done`, `is_del`) VALUES(1, 'buy a car', 0, 0),(2, 'buy a mao', 0, 0);---- Indexes for dumped tables------ Indexes for table `todos`--ALTER TABLE `todos` ADD PRIMARY KEY (`id`);---- AUTO_INCREMENT for dumped tables------ AUTO_INCREMENT for table `todos`--ALTER TABLE `todos` MODIFY `id` int(12) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=3;
访问 http://localhost/index/index
0 0
- PHP 框架
- PHP框架
- php框架
- php框架
- php框架
- PHP框架
- PHP框架
- php 框架
- php框架
- php框架
- php框架
- PHP框架
- PHP框架
- PHP框架
- PHP框架三:Yii框架
- PHP Web 框架
- PHP开发框架总结
- PHP开发框架
- oj1971: 相加和最大值
- Python列表及简单操作
- Java语言基础(一)-java主类结构
- SyntaxError: Non-ASCII character '\xe5' in file H:\workspace\output\out\out.py on line 4, but no enc
- 208UVA救火车
- php框架
- Java LinkedList 源码小结
- uoj275. 【清华集训2016】组合数问题
- 495. Teemo Attacking
- Python的GIL是什么鬼,多线程性能究竟如何
- php基础知识
- 蛙人高频交易拆单策略—带手续费拆单策略及原理说明
- Caffe框架的理解(二):详解AlexNet
- 并查集