github路径:https://github.com/zhengchuzhou/easyPhpFramework

一、目录结构及用途

二、相关代码:

1、入口文件(index.php):

<?php
/**
* 入口文件
* 1、定义常量
* 2、加载函数库
* 3、启动框架
*/
define('ROOT', realpath('./'));
define('CORE', ROOT.'/core');
define('APP', ROOT.'/app');
define('MODULE', 'app'); include "vendor/autoload.php"; // 引入composer加载的类 define('DEBUG', true);
if (DEBUG) {
$whoops = new \Whoops\Run;
$whoops->pushHandler(new \Whoops\Handler\PrettyPageHandler);
$whoops->register();
ini_set('display_errors', 'On');
} else
ini_set('display_errors', 'Off'); include_once CORE.'/common/function.php';
include_once CORE.'/core.php'; spl_autoload_register('\core\core::load'); \core\core::run();

2、公用函数库(function.php):

<?php
/**
* 公告函数库
*/ function p($var)
{
if (is_bool($var))
var_dump($var);
elseif (is_null($var))
var_dump(NULL);
else {
echo "<pre style='position:relative; z-inenx: 1000; padding: 10px; border-radius: 5px; background: #F5F5F5;
border: 1px solid #aaa; font-size: 14px; line-height: 18px; opacity: 0.9;'>" . print_r($var, true) . "</pre>";
}
}

3、核心文件(core.php):

<?php
/**
* 核心文件
*/
namespace core; use core\lib\log; class core
{
public $assign = [];
static public function run()
{
log::init();
$route = new \core\lib\route(); $controller = $route->controller;
$action = $route->action;
$file = APP.'/controller/'.$controller.'Controller.php';
$class = '\\'.MODULE.'\\controller\\'.$controller.'Controller';
if (is_file($file)) {
include_once $file;
$class = new $class();
$class->$action();
} else
throw new \Exception('找不到控制器:'.$controller);
} static public function load($class)
{
// 自动加载类库
$class = str_replace('\\', '/', $class);
$file = ROOT.'/'.$class.'.php';
if (is_file($file))
include_once $file;
else
return false;
} public function assign($name, $value)
{
$this->assign[$name] = $value;
} public function display($file)
{
$file = APP.'/view/'.$file.'.php';
if (is_file($file)) {
extract($this->assign);
include $file;
} else
throw new \Exception('找不到该视图文件');
}
}

4、路由文件(route.php):

<?php
/**
* 路由文件
*/
namespace core\lib;
use \core\lib\conf; class route
{
public $controller;
public $action;
public function __construct()
{
$uri = $_SERVER['REQUEST_URI'];
if (isset($uri) && $uri != '/') {
$uriArr = explode('/', trim($uri, '/'));
if (isset($uriArr[0])) {
$this->controller = $uriArr[0];
unset($uriArr[0]);
}
if (isset($uriArr[1])) {
$this->action = $uriArr[1];
unset($uriArr[1]);
}
else
$this->action = conf::getConf('ACTION', 'route');
// uri多余部分转化成GET
for ($i = 2; $i < count($uriArr) + 2; $i += 2)
isset($uriArr[$i + 1]) ? $_GET[$uriArr[$i]] = $uriArr[$i + 1] : '';
} else {
$this->controller = conf::getConf('CONTROLLER', 'route');
$this->action = conf::getConf('ACTION', 'route');
}
log::log('controller:'.$this->controller.', action:'.$this->action.', get:'. json_encode($_GET));
}
}

5、数据库模型类(model.php):

<?php
/**
* model类
*/
namespace core\lib;
use \core\lib\conf; class model extends \PDO
{
public function __construct()
{
try {
$conf = conf::getAll('db');
parent::__construct($conf['DSN'], $conf['USERNAME'], $conf['PASSWD']);
} catch (\PDOException $e) {
p($e->getMessage());
}
}
}

6、配置文件类(conf.php):

<?php
/**
* 配置类
*/
namespace core\lib; class conf
{
static public $conf = [];
static public function getConf($name, $file)
{
/**
* 1、判断文件是否存在
* 2、判断配置是否存在
* 3、缓存配置
*/
$conf = self::getAll($file);
if (isset($conf[$name]))
return $conf[$name];
else
throw new \Exception('没有这个配置项'.$name);
} static public function getAll($file)
{
/**
* 1、判断文件是否存在
* 2、缓存配置
*/
if (!isset(self::$conf[$file])) {
$path = ROOT.'/core/config/'.$file.'.php';
if (!is_file($path)) {
throw new \Exception('找不到配置文件:'.$file);
die();
} else {
self::$conf[$file] = include $path;
}
}
return self::$conf[$file];
}
}

7、日志类(log.php):

<?php
/**
* 日志类
*/
namespace core\lib;
use \core\lib\conf; class log
{
static public $class;
/**
* 1、确定日志存储方式
* 2、写日志
*/
static public function init()
{
// 确定存储方式
$drive = conf::getConf('DRIVE', 'log');
$class = '\core\lib\log\\'.$drive;
self::$class = new $class;
} static public function log($message, $file = 'log')
{
self::$class->log($message, $file);
}
}

8、文件日志驱动类(file.php):

<?php
namespace core\lib\log; use core\lib\conf; class file
{
public $path;
public function __construct()
{
$this->path = conf::getConf('OPTION', 'log')['PATH'].date('Ymd').'/';
} public function log($message, $file = 'log')
{
/**
* 1、确定日志存储目录是否存在
* 不存在,新建目录
* 2、写入日志
*/
if (!is_dir($this->path))
mkdir($this->path, '0777', 'true');
$message = date('Y-m-d H:i:s') . ' ' . json_encode($message) . PHP_EOL;
file_put_contents($this->path.$file.'.php', $message, FILE_APPEND);
}
}

9、相关的配置文件:

数据库配置文件(db.php):

<?php
/**
* 数据库配置文件
*/
return array(
'DSN' => 'mysql:host=localhost; dbname=test',
'USERNAME' => 'root',
'PASSWD' => 'xy123456'
);

日志配置文件(log.php):

<?php
/**
* 日志配置文件
*/
return array(
'DRIVE' => 'file',
'OPTION' => [
'PATH' => ROOT.'/log/'
]
);

路由配置文件(route.php):

<?php
return array(
'CONTROLLER' => 'index',
'ACTION' => 'index'
);

三、nginx配置,优化url路径

if (!-e $request_filename) {
rewrite ^(.*)$ /index.php/$1 last;
}

四、配置composer,加载php扩展

{
"name": "TEST PHP",
"description": "PHP Framework",
"type": "Framework",
"keywords": [
"PHP", "PHP Framework"
],
"require": {
"php": ">= 5.3.0",
"filp/whoops": "*",
"symfony/var-dumper": "*",
"catfan/medoo": "*"
}
}

开发基本的php框架的更多相关文章

  1. ASP.NET MVC5 网站开发实践(一) - 项目框架

    前几天算是开题了,关于怎么做自己想了很多,但毕竟没做过项目既不知道这些想法有无必要,也不知道能不能实现,不过邓爷爷说过"摸着石头过河"吧.这段时间看了一些博主的文章收获很大,特别是 ...

  2. plain framework 1(简约框架)一款主要用于网络(游戏)开发的C/C++框架 即将开源发布

    在我们的日常开发中,我们往往会遇到这种情况,当我们换了一个开发环境时很可能会重新利用一套新的框架进行开发.由于不同框架有着不同的接口,所以我们不得不花时间再次熟悉这些接口,这将造成开发时间上的重复,而 ...

  3. Asp.net Mvc模块化开发之分区扩展框架

    对于一个企业级项目开发,模块化是非常重要的. 默认Mvc框架的AreaRegistration对模块化开发真的支持很好吗?真的有很多复杂系统在使用默认的分区开发的吗?我相信大部分asp.net的技术团 ...

  4. ASP.NET MVC5 网站开发实践(一) - 项目框架(转)

    前几天算是开题了,关于怎么做自己想了很多,但毕竟没做过项目既不知道这些想法有无必要,也不知道能不能实现,不过邓爷爷说过“摸着石头过河”吧.这段时间看了一些博主的文章收获很大,特别是@kencery,依 ...

  5. Windows上python开发--2安装django框架

    Windows上python开发--2安装django框架 分类: 服务器后台开发2014-05-17 21:22 2310人阅读 评论(2) 收藏 举报 python django 上一篇文章中讲了 ...

  6. 10个用于Web开发的最好 Python 框架

    Python 是一门动态.面向对象语言.其最初就是作为一门面向对象语言设计的,并且在后期又加入了一些更高级的特性.除了语言本身的设计目的之外,Python标准 库也是值得大家称赞的,Python甚至还 ...

  7. iOS开发之常用第三方框架(下载地址,使用方法,总结)

    iOS开发之常用第三方框架(下载地址,使用方法,总结) 说句实话,自学了这么久iOS,如果说我不知道的但是又基本上都摸遍了iOS相关知识,但是每次做项目的时候,遇到难一点的地方或者没试过的东西就闷了. ...

  8. Android开发中用到的框架、库介绍

    Android开发中用到的框架介绍,主要记录一些比较生僻的不常用的框架,不断更新中...... 网路资源:http://www.kuqin.com/shuoit/20140907/341967.htm ...

  9. 开发自己PHP MVC框架(一)

    本教程翻译自John Squibb 的Build a PHP MVC Framework in an Hour,但有所改动,原文地址:http://johnsquibb.com/tutorials 这 ...

  10. Phaser是一款专门用于桌面及移动HTML5 2D游戏开发的开源免费框架

    Phaser是一款专门用于桌面及移动HTML5 2D游戏开发的开源免费框架,提供JavaScript和TypeScript双重支持,内置游戏对象的物理属性,采用Pixi.js引擎以加快Canvas和W ...

随机推荐

  1. java数组与字符串相互转换、整型与字符串相互转换【详解】

      java 数组->字符串 1.char数组(字符数组)->字符串 可以通过:使用String.copyValueOf(charArray)函数实现.  举例: char[] arr={ ...

  2. python pep8 命令规范

    命名规范:总体原则,新编代码必须按下面命名风格进行,现有库的编码尽量保持风格.1 尽量单独使用小写字母‘l’,大写字母‘O’等容易混淆的字母.2 模块命名尽量短小,使用全部小写的方式,可以使用下划线. ...

  3. bzoj 1042: [HAOI2008]硬币购物【dp】

    设f[i]为凑i元的方案数,这个随便dp一下就行了 然后处理限制,我们考虑用容斥,也就是4个超限-3个超限+2个超限-1个超限,这里用状压枚举一下,然后i硬币超限就当做选了d[i]+1个,在s里减去, ...

  4. JAVA值传递和引用传递 以及 实参是否改变

    八大数据类型和String 在进行传递的时候  不会改变. 八大数据类型 public class parameterValue { //值传递 public static void main(Str ...

  5. 《Windows核心编程系列》十一谈谈Windows线程池

    Windows线程池 上一篇博文我们介绍了IO完成端口.得知IO完成端口可以非常智能的分派线程.但是IO完成端口仅对等待它的线程进行分派,创建和销毁线程的工作仍然需要我们自己来做. 我们自己也可以创建 ...

  6. Vasiliy's Multiset CodeForces -706D || 01字典树模板

    就是一个模板 注意这题有一个要求:有一个额外的0一直保持在集合中 #include<cstdio> #include<algorithm> using namespace st ...

  7. 转】MongoDB 自动分片 auto sharding

    原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/4/ 感谢! MongoDB 自动分片 auto shard ...

  8. Android开发学习——游戏开发小demo

    public class MainActivity extends Activity { private GameUI gameUI; @Override protected void onCreat ...

  9. jq判断上下滚动

    $(document).ready(function(){ var p=0,t=0; $(window).scroll(function(e){ p = $(this).scrollTop(); if ...

  10. Collection接口框架图

    Java集合大致可分为Set.List和Map三种体系,其中Set代表无序.不可重复的集合:List代表有序.重复的集合:而Map则代表具有映射关系的集合.Java 5之后,增加了Queue体系集合, ...