惊世php框架,一个文件,40行代码,基本框架功能全实现
时间:2012-01-10
来源:互联网
自己写的php框架,准备自己搞程序用,
只有一个index.php文件,40来行代码,
单点入口、自动加载、视图、模型、控制器全部实现。
php框架 = 规范 + 类库。
这只是个规范,类库可以慢慢攒。
- <?php
- /**
- *php框架控制规范页,
- *实现功能:单点入口,自动加载类,视图,模型,控制器
- *配合mysql数据库连接类、缓存静态文件生成类等其他类库,就是完整的框架
- */
- header("Content-type: text/html; charset=utf-8");
-
- //url?赋值给数组$c。
- $c = array();
- $c['controller'] = (!empty($_REQUEST['c']) ? (string)($_REQUEST['c']) : 'index'); //值为空默认为index
- $c['page'] = (isset($_REQUEST['p']) ? (int)($_REQUEST['p']) : '');
-
- //控制器函数,把$c的url参数传递给模块和模板执行,模块和模板文件一一对应,如果两者名称相同默认同时加载,自动化省去了手动写代码调用模块或者模板
- function controller($c)
- {
- $cPath=array();
- $cPath['module'] = 'module/' . $c['controller'] . '.php';
- $cPath['template'] = 'template/' . $c['controller'] . '.html';
-
- if(is_file($cPath['module']))
- {
- require_once('class/mysql.class.php'); //加载模块必须的数据库连接类---------------模块和模版加载方式尚待研究
-
- if($c['controller'] == 'index') //如果?c值为默认的index
- {
- if(!empty($c['page'])) //如果?p值不空。
- {
- require_once('module/page.php'); //加载内页模块
- require_once('template/page.html'); //加载内页模板
- }
- }
-
- require_once($cPath['module']); //根据$c调用加载模块文件
- } else {
- echo '<hr />没有对应' . $cPath['module'] .'的模块<hr />';
- }
- if(is_file($cPath['template']))
- {
- (is_file($cPath['module'])) ? require_once($cPath['module']) : ''; //加载模板操作必须的对应模块类
- require_once($cPath['template']); //根据$c调用加载模板文件
- } else {
- echo '<hr />没有对应' . $cPath['template'] .'的模板<hr />';
- }
- }
- controller($c);
- //模块的sql变量都改为数组值
- ?>
补充内容 (2012-1-12 20:58):
22楼的框架服了,三行代码实现了我的php框架控制器功能。
require_once 'controllers/'.$_GET['c'].'.php'
$c = new $_GET['c'];
$c->$_GET['m'] ();
补充内容 (2012-2-20 15:38):
http://bbs.phpchina.com/thread-231811-1-1.html
这是2.0版本,只有20行代码,比这个更强了
作者: dongzide 发布时间: 2012-01-10
下面给个这个框架的实际案例。
程序文件系统:
class (放类库)
module (放模块)
template (放模板)
public (放图片、js、css)
index.php (根目录下就这个文件,控制器)
作者: dongzide 发布时间: 2012-01-10
-
- <?php
- class mysql
- {
- public function __construct()
- {
- $host = "localhost"; //主机名
- $user = "root"; //用户名
- $pwd = "root"; //密码
- $db = "ceshi"; //数据库
-
- $conn = mysql_connect($host, $user, $pwd) or die ("链接数据库失败,错误信息:<hr />".mysql_error());
- mysql_select_db($db) or die ("没找到(".$db.")数据库,链接失败,错误信息:<hr />".mysql_error());
-
- mysql_set_charset("utf8");
- }
- }
作者: dongzide 发布时间: 2012-01-10
作者: 北漂 发布时间: 2012-01-10
下面是module和template
程序实现一个表单(表单自己写)插入数据库,然后用模版读取出来的功能
postMod.php
- <?php
- class postMod extends mysql
- {
- public function __construct()
- {
- parent::__construct();
- $title = ($_REQUEST['title']); //内容中有单引号时候sql出错
- $excerpt = ($_REQUEST['excerpt']);
- $content = ($_REQUEST['content']);
- $author = $_REQUEST['author'];
-
- $sql = "insert into posts (post_title, post_excerpt, post_content, post_author) values ('$title', '$excerpt', '$content', '$author')";
- mysql_query($sql) or die(mysql_error());
- echo '插入成功,点击链接返回查询';
- echo '<hr />';
- }
- }
- new postMod();
- ?>
下面是模板输出:
index.html
- <?php
- class indexTmp extends indexMod
- {
- public function __construct()
- {
- parent::__construct();
- while($this->row = mysql_fetch_array($this->result))
- {
- echo '<a href="?p=' . $this->row['post_id'] . '">' . $this->row['post_id'] . "——" . $this->row['post_title'] . "——" . $this->row['post_excerpt'] . "——" . $this->row['post_content'] . "——" . $this->row['post_author'] . '</a>';
- echo "<hr />";
- }
- }
-
- }
- new indexTmp();
- ?>
网站的链接形式是这样的:
www.aaa.com/index.php?c=xxx&p=123
其中,c=xxx是调用程序的模块和模板,p是单页,就是单个的帖子文章。目前需要这么多,需要更多参数的可以后面再加
index.php可以省略变成这样:
www.aaa.com/?c=xxx&p=123
作者: dongzide 发布时间: 2012-01-10
很简单。
自己写的框架,就是好使,大家给点建议吧
作者: dongzide 发布时间: 2012-01-10
LZ你这太初级了 慢慢搞吧 跟项目理解有关系 立足于功能是看不到的
框架需要的规范,视图模型控制器、单点入口,自动加载,
这个框架都实现了起,其他复杂功能加类库就好了吧。
何来初级一说???
不妨说说高级的框架,都有啥高级功能,我这个初级的,有什么值得改进的地方?
作者: dongzide 发布时间: 2012-01-10
1:增加个全局配置的文件,如mysql连接参数都放里面
2:增加全局控制文件,如限制某些ip访问
3:增加全局函数文件,如一些常用的函数,比如格式化时间,当然了这些放在class里也是不错的。
4:p这个参数如果是分页符的话,建议也放在class里,吧样式都加进去,以后会方便。
5:public里不建议放图片,建议你提出来,好处有几点,如文件过多,可做个磁盘挂在点。而且过多的图片放在一个文件夹里会影响速度,建议文件夹命名搞个冒泡算法。
提倡自己写框架,开源的功能太多,n多都用不上,而且了解代码比自己写还浪费时间。
作者: eleven11 发布时间: 2012-01-10
几个建议
1:增加个全局配置的文件,如mysql连接参数都放里面
2:增加全局控制文件,如限制某些ip访问
完全同意,双手支持。每个phper都要有个自己写的框架,现成的不要用。
像我这样写一个框架也很省事啊,比现成的好用多了。
你说这些功能改进,我慢慢研究,暂时用不到的可以以后改版再添加进去,目前先关注急需的功能,把站先搞出来
作者: dongzide 发布时间: 2012-01-10
何来惊世之说,务实点好。
作者: xiaochong0302 发布时间: 2012-01-10
作者: hooyooo 发布时间: 2012-01-10
进来用框架越来越不给力了…
作者: xuan20070am 发布时间: 2012-01-10
何来惊世之说,务实点好。
给点建议也好
作者: 迷失羔羊 发布时间: 2012-01-10
被标题骗进来了。。。。。
不惊世你不进来啊,没办法,给点意见吧
作者: dongzide 发布时间: 2012-01-10
越用框架感觉越会被限制…
进来用框架越来越不给力了…
自写自用框架就没有这个问题吧
作者: dongzide 发布时间: 2012-01-10
我只问你几个问题,项目中经常遇见的模型对象耦合度,你是怎么处理的?框架的层次你打算怎么做?做的话有什么特点?项目对于框架要求的重点在什么地方?
细节点的:一个对象,你觉得是需要实例化和非实例化?载入的文件你是怎么做优化的?
.......
太多了,不要提惊世,务实点多好,框架要解决的问题,绝对不是脚本的问题,而是项目的问题。
作者: dongzide 发布时间: 2012-01-10
LZ等你真正写出一款框架就明白了,框架解决的事情不是功能,而是对项目工程的控制的一种解决方案,为了几个 ...
模型对象耦合度是啥?
我的想法是模型和视图,文件名相同就同时加载操作,不相同就根据url对应加载。
框架的层次,根目录index.php,子目录分为class module template 这几个放类库,模块,模板
载入文件是根据url按需载入的,不需要的不载入,不存在效率问题吧。
载入就是实例化好的,否则岂不是要多写一步
考虑下你的建议
作者: 北漂 发布时间: 2012-01-10
根据你上面回答的答案,你写的是脚本 不是框架 真正的框架,只有写过了才会体会,需要解决的不是脚本层面的东西。
作者: dongzide 发布时间: 2012-01-10
而楼主你的东西无非就是弄了一个简单的路由。说框架还差得远。
作者: 北漂 发布时间: 2012-01-10
作者: magki 发布时间: 2012-01-11
- require_once 'controllers/'.$_GET['c'].'.php'
- $c = new $_GET['c'];
- $c->$_GET['m'] ();
作者: kilobug 发布时间: 2012-01-11
- <?php
作者: tmkook 发布时间: 2012-01-11
1.适合敏捷开发
2.可以满足团队开发, 例如MVC 分开啊, 功能模块分开权限啊...
3.框架好坏应该要考虑到是否适合项目管理.
4....
作者: 路游宝宝 发布时间: 2012-01-11
作者: desand 发布时间: 2012-01-11
作者: 天外飞仙 发布时间: 2012-01-11
作者: shmiya 发布时间: 2012-01-11
作者: 剑枫 发布时间: 2012-01-11
才三行我就实现了
哈哈,我感觉你更牛~逗死我了
作者: action2001 发布时间: 2012-01-11
作者: 北海情书 发布时间: 2012-01-12
才三行我就实现了
哥,服了,
你这算是史上最小php框架了,
三行代码完美实现基本框架控制器功能
作者: 七月十五 发布时间: 2012-01-12
拿去用,BSD 授权。
不厚道,
你这行不如楼上,
过于博大精深了
作者: dongzide 发布时间: 2012-01-12
拒绝echo,拒绝HTML,拥抱return,拥抱try...catch...
拒绝echo拥抱return就算了,
为何拒绝html,难道try。。。catch能代替html?
作者: dongzide 发布时间: 2012-01-12
依我理解 框架之用途:
1.适合敏捷开发
我感觉我这个基本符合你的要求啊
作者: dongzide 发布时间: 2012-01-12
作者: dongzide 发布时间: 2012-01-12
我感觉我这个基本符合你的要求啊
或者吧..
譬如是试试自己(一个人)用这个框架开发一个基本的商城网站
然后又
譬如试试自己管理一个团队用这个框架开发一个基本的商城网站
然后. 就知道了.
作者: smartfoxbaby 发布时间: 2012-01-12
$c = new $_GET['c'];
$c->$_GET['m'] ();
有高手给讲解一下呗 ,我是好学的菜鸟。。。
作者: desand 发布时间: 2012-01-13
作者: xiaoyaoyou 发布时间: 2012-01-13
作者: jig68 发布时间: 2012-01-13
作者: dongzide 发布时间: 2012-01-13
几个建议
1:增加个全局配置的文件,如mysql连接参数都放里面
2:增加全局控制文件,如限制某些ip访问
這個哥哥最後一句我挺起來
作者: starflash 发布时间: 2012-01-13
作者: aibuai 发布时间: 2012-01-13
- <?php
- is_file('c/'.$_GET['c'].'.php') && require 'c/'.$_GET['c'].'.php';
- $r = class_exists($_GET['c'], false) ? (new $_GET['c']()) : exit('index');
- method_exists($r, $_GET['m']) ? $r->$_GET['m']() : exit('index');
- ?>
作者: onlineuser 发布时间: 2012-01-13
作者: Moyo 发布时间: 2012-01-13
作者: phpin 发布时间: 2012-01-15
依我理解 框架之用途:
1.适合敏捷开发
确实是,框架是为了开发需求而制定的。
感觉lz涉水不深,但是能自己写点东西有自己的想法,只要自己需要什么样子的框架,也是一个很好的开始。
这个框架确实有点粗糙,如mvc中的c没有做任何过滤,安全相关的东西,这些都是比较初级的问题。
lz慢慢来吧,以后有你要学的东西。有自己的想法固然好,但是别太自大,我做了4年php都不敢说自己精通。。。
作者: alemic 发布时间: 2012-01-15
作者: eleven11 发布时间: 2012-01-16
InitPHP2.1 用框架,不骨折
http://initphp.com
作者: 风起云涌 发布时间: 2012-01-16
拒绝echo拥抱return就算了,
为何拒绝html,难道try。。。catch能代替html?
这个很难解释。
不过如果你有时间去研究一下HTML、XML、JSON编码,看看ExtJS、Dojo等,估计有很大的收获。
作者: zhuli86122068 发布时间: 2012-01-17
作者: 七月十五 发布时间: 2012-01-19
作者: mimizzee 发布时间: 2012-01-24
PS:你的牛逼框架本地包含文件没过滤
作者: liaoyuan 发布时间: 2012-01-24
作者: xuxu 发布时间: 2012-01-24
框架不止是一个分层,还要有自己的一套类库和体系。。
要划分好哪些是底层模块哪些是扩展模块,还要抽象解耦等等。。
当你的框架里常用的功能模块都有的时候才算是框架。。
作者: wzwen 发布时间: 2012-01-26
强烈支持
建设性代码
作者: tmkook 发布时间: 2012-01-31
这个很难解释。
不过如果你有时间去研究一下HTML、XML、JSON编码,看看ExtJS、Dojo等,估计有很大的收获 ...
咳,学php好累啊,还要懂htmlxmljsonextjsdojo
作者: dongzide 发布时间: 2012-01-31
感谢大家的意见和建议,我会继续完善自己的框架的
作者: dongzide 发布时间: 2012-01-31
咳,学php好累啊,还要懂htmlxmljsonextjsdojo
看完了HTML、XML、JSON、SOAP、REST、ExtJS、DOJO,你才能扔掉他们,纯粹的深入PHP啊
入门 → 涉猎 → 沉淀
作者: dongzide 发布时间: 2012-01-31
作者: 七月十五 发布时间: 2012-02-01
看看sinatra什么叫微框架
ruby不是已经被抛弃了么???
连twitter都不再用它做开发语言了
作者: leric 发布时间: 2012-02-01
作者: dongzide 发布时间: 2012-02-02
作者: linlaoye1988 发布时间: 2012-02-05
作者: AmuroPikin 发布时间: 2012-02-06
作者: zanmaolin 发布时间: 2012-02-06
作者: QQ公馆 发布时间: 2012-03-25
作者: 烟雨一点尘 发布时间: 2012-03-28
作者: saxier123 发布时间: 2012-03-29
作者: jopgle6ufi 发布时间: 2012-03-29
作者: 飞翔的太阳 发布时间: 2012-03-29
作者: wujibing 发布时间: 2012-05-02
作者: falling 发布时间: 2012-05-03
不过楼主的框架能抛出这么多知识点,确实让阅读者收益不少。
我想问一下框架的功能模块应该怎么设计的?
作者: sanzhongzhifu 发布时间: 2012-05-05
作者: jyoumei 发布时间: 2012-05-05
作者: myskl 发布时间: 2012-05-07
作者: 回首过去 发布时间: 2012-05-07
考虑东西太少了。说白了就是简单的对url解析 ,假设用控制台进行 你这个解析不了。提升空间很大 ...
啥是php控制台呢??????为何解析不了,说说
作者: dyl213 发布时间: 2012-05-08
作者: 4664919 发布时间: 2012-05-10
在这里我见识了3行框架,特么牛掰
再要摇,看得压力山大
作者: dongzide 发布时间: 2012-05-14
作者: hit9 发布时间: 2012-05-15
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28