首页 | 新闻 | 交流 | 问吧 | 文档 | 手册 | 下载 | 博客

收藏此问题 发表新评论

惊世php框架,一个文件,40行代码,基本框架功能全实现

本帖最后由 dongzide 于 2012-1-10 14:10 编辑

自己写的php框架,准备自己搞程序用,

只有一个index.php文件,40来行代码,
单点入口、自动加载、视图、模型、控制器全部实现。

php框架 = 规范 + 类库。

这只是个规范,类库可以慢慢攒。

  1. <?php
  2. /**
  3. *php框架控制规范页,
  4. *实现功能:单点入口,自动加载类,视图,模型,控制器
  5. *配合mysql数据库连接类、缓存静态文件生成类等其他类库,就是完整的框架
  6. */
  7. header("Content-type: text/html; charset=utf-8");

  8. //url?赋值给数组$c。
  9. $c = array();
  10. $c['controller'] = (!empty($_REQUEST['c']) ? (string)($_REQUEST['c']) : 'index'); //值为空默认为index
  11. $c['page'] = (isset($_REQUEST['p']) ? (int)($_REQUEST['p']) : '');

  12. //控制器函数,把$c的url参数传递给模块和模板执行,模块和模板文件一一对应,如果两者名称相同默认同时加载,自动化省去了手动写代码调用模块或者模板
  13. function controller($c)
  14. {
  15. $cPath=array();
  16. $cPath['module'] = 'module/' . $c['controller'] . '.php';
  17. $cPath['template'] = 'template/' . $c['controller'] . '.html';

  18. if(is_file($cPath['module']))
  19. {
  20. require_once('class/mysql.class.php'); //加载模块必须的数据库连接类---------------模块和模版加载方式尚待研究

  21. if($c['controller'] == 'index') //如果?c值为默认的index
  22. {
  23. if(!empty($c['page'])) //如果?p值不空。
  24. {
  25. require_once('module/page.php'); //加载内页模块
  26. require_once('template/page.html'); //加载内页模板
  27. }
  28. }

  29. require_once($cPath['module']); //根据$c调用加载模块文件
  30. } else {
  31. echo '<hr />没有对应' . $cPath['module'] .'的模块<hr />';
  32. }
  33. if(is_file($cPath['template']))
  34. {
  35. (is_file($cPath['module'])) ? require_once($cPath['module']) : ''; //加载模板操作必须的对应模块类
  36. require_once($cPath['template']); //根据$c调用加载模板文件
  37. } else {
  38. echo '<hr />没有对应' . $cPath['template'] .'的模板<hr />';
  39. }
  40. }
  41. controller($c);
  42. //模块的sql变量都改为数组值
  43. ?>
复制代码



补充内容 (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 13:57:41
怎么样,大家给点建议,再优化下,
下面给个这个框架的实际案例。

程序文件系统:
class (放类库)
module (放模块)
template (放模板)
public (放图片、js、css)
index.php (根目录下就这个文件,控制器)
昵称: dongzide  时间: 2012-01-10 13:59:30
mysql.class.php (数据库链接类)


  1. <?php
  2. class mysql
  3. {
  4. public function __construct()
  5. {
  6. $host = "localhost"; //主机名
  7. $user = "root"; //用户名
  8. $pwd = "root"; //密码
  9. $db = "ceshi"; //数据库

  10. $conn = mysql_connect($host, $user, $pwd) or die ("链接数据库失败,错误信息:<hr />".mysql_error());
  11. mysql_select_db($db) or die ("没找到(".$db.")数据库,链接失败,错误信息:<hr />".mysql_error());

  12. mysql_set_charset("utf8");
  13. }
  14. }
复制代码

昵称: dongzide  时间: 2012-01-10 14:02:13
LZ你这太初级了  慢慢搞吧 跟项目理解有关系  立足于功能是看不到的
昵称: 北漂  时间: 2012-01-10 14:03:11
本帖最后由 dongzide 于 2012-1-10 14:51 编辑

下面是module和template
程序实现一个表单(表单自己写)插入数据库,然后用模版读取出来的功能

postMod.php

  1. <?php
  2. class postMod extends mysql
  3. {
  4. public function __construct()
  5. {
  6. parent::__construct();
  7. $title = ($_REQUEST['title']); //内容中有单引号时候sql出错
  8. $excerpt = ($_REQUEST['excerpt']);
  9. $content = ($_REQUEST['content']);
  10. $author = $_REQUEST['author'];

  11. $sql = "insert into posts (post_title, post_excerpt, post_content, post_author) values ('$title', '$excerpt', '$content', '$author')";
  12. mysql_query($sql) or die(mysql_error());
  13. echo '插入成功,点击链接返回查询';
  14. echo '<hr />';
  15. }
  16. }
  17. new postMod();
  18. ?>
复制代码

下面是模板输出:

index.html
  1. <?php
  2. class indexTmp extends indexMod
  3. {
  4. public function __construct()
  5. {
  6. parent::__construct();
  7. while($this->row = mysql_fetch_array($this->result))
  8. {
  9. 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>';
  10. echo "<hr />";
  11. }
  12. }

  13. }
  14. new indexTmp();
  15. ?>
复制代码

网站的链接形式是这样的:
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 14:06:29
好了,一个功能完整的记事本完成了。

很简单。

自己写的框架,就是好使,大家给点建议吧
昵称: dongzide  时间: 2012-01-10 14:07:52
北漂 发表于 2012-1-10 14:03
LZ你这太初级了  慢慢搞吧 跟项目理解有关系  立足于功能是看不到的

框架需要的规范,视图模型控制器、单点入口,自动加载,
这个框架都实现了起,其他复杂功能加类库就好了吧。

何来初级一说???

不妨说说高级的框架,都有啥高级功能,我这个初级的,有什么值得改进的地方?
昵称: dongzide  时间: 2012-01-10 14:09:16
几个建议
1:增加个全局配置的文件,如mysql连接参数都放里面
2:增加全局控制文件,如限制某些ip访问
3:增加全局函数文件,如一些常用的函数,比如格式化时间,当然了这些放在class里也是不错的。
4:p这个参数如果是分页符的话,建议也放在class里,吧样式都加进去,以后会方便。
5:public里不建议放图片,建议你提出来,好处有几点,如文件过多,可做个磁盘挂在点。而且过多的图片放在一个文件夹里会影响速度,建议文件夹命名搞个冒泡算法。

提倡自己写框架,开源的功能太多,n多都用不上,而且了解代码比自己写还浪费时间。
昵称: eleven11  时间: 2012-01-10 14:35:59
eleven11 发表于 2012-1-10 14:35
几个建议
1:增加个全局配置的文件,如mysql连接参数都放里面
2:增加全局控制文件,如限制某些ip访问

完全同意,双手支持。每个phper都要有个自己写的框架,现成的不要用。
像我这样写一个框架也很省事啊,比现成的好用多了。

你说这些功能改进,我慢慢研究,暂时用不到的可以以后改版再添加进去,目前先关注急需的功能,把站先搞出来
昵称: dongzide  时间: 2012-01-10 14:54:15
本帖最后由 xiaochong0302 于 2012-1-10 14:56 编辑

何来惊世之说,务实点好。
昵称: xiaochong0302  时间: 2012-01-10 14:56:00
被标题骗进来了。。。。。
昵称: hooyooo  时间: 2012-01-10 15:10:23
越用框架感觉越会被限制…
进来用框架越来越不给力了…
昵称: xuan20070am  时间: 2012-01-10 15:10:27
xiaochong0302 发表于 2012-1-10 14:56
何来惊世之说,务实点好。

给点建议也好
昵称: 迷失羔羊  时间: 2012-01-10 15:18:00
hooyooo 发表于 2012-1-10 15:10
被标题骗进来了。。。。。

不惊世你不进来啊,没办法,给点意见吧
昵称: dongzide  时间: 2012-01-10 15:20:24
xuan20070am 发表于 2012-1-10 15:10
越用框架感觉越会被限制…
进来用框架越来越不给力了…

自写自用框架就没有这个问题吧
昵称: dongzide  时间: 2012-01-10 15:20:46
LZ等你真正写出一款框架就明白了,框架解决的事情不是功能,而是对项目工程的控制的一种解决方案,为了几个类而写框架,那不叫框架而是脚本。
我只问你几个问题,项目中经常遇见的模型对象耦合度,你是怎么处理的?框架的层次你打算怎么做?做的话有什么特点?项目对于框架要求的重点在什么地方?
细节点的:一个对象,你觉得是需要实例化和非实例化?载入的文件你是怎么做优化的?
.......
太多了,不要提惊世,务实点多好,框架要解决的问题,绝对不是脚本的问题,而是项目的问题。
昵称: dongzide  时间: 2012-01-10 15:21:06
本帖最后由 dongzide 于 2012-1-10 17:03 编辑
北漂 发表于 2012-1-10 15:45
LZ等你真正写出一款框架就明白了,框架解决的事情不是功能,而是对项目工程的控制的一种解决方案,为了几个 ...


模型对象耦合度是啥?
我的想法是模型和视图,文件名相同就同时加载操作,不相同就根据url对应加载。

框架的层次,根目录index.php,子目录分为class module template 这几个放类库,模块,模板

载入文件是根据url按需载入的,不需要的不载入,不存在效率问题吧。
载入就是实例化好的,否则岂不是要多写一步

考虑下你的建议
昵称: 北漂  时间: 2012-01-10 15:45:55
本帖最后由 北漂 于 2012-1-10 17:19 编辑

根据你上面回答的答案,你写的是脚本  不是框架  真正的框架,只有写过了才会体会,需要解决的不是脚本层面的东西。
昵称: dongzide  时间: 2012-01-10 17:03:14
最浅显的就是。框架都是服务于项目诉求的,比如敏捷开发,比如易用的可扩展性

而楼主你的东西无非就是弄了一个简单的路由。说框架还差得远。
昵称: 北漂  时间: 2012-01-10 17:17:55
{:soso_e113:} 标题党
昵称: magki  时间: 2012-01-11 10:45:51
  1. require_once 'controllers/'.$_GET['c'].'.php'
  2. $c = new $_GET['c'];
  3. $c->$_GET['m'] ();
复制代码
才三行我就实现了
昵称: kilobug  时间: 2012-01-11 10:55:32
  1. <?php
复制代码
拿去用,BSD 授权。
昵称: tmkook  时间: 2012-01-11 11:25:43
依我理解 框架之用途:

1.适合敏捷开发
2.可以满足团队开发, 例如MVC 分开啊, 功能模块分开权限啊...
3.框架好坏应该要考虑到是否适合项目管理.
4....
昵称: 路游宝宝  时间: 2012-01-11 11:57:31
额 都是牛叉人物 40行到3行
昵称: desand  时间: 2012-01-11 15:39:30
自己用用就算了,通用型框架比较难做的。。
昵称: 天外飞仙  时间: 2012-01-11 17:04:01
标题党,拉出去枪毙十分钟{:soso__5069351604328262862_1:}
昵称: shmiya  时间: 2012-01-11 17:17:14
呵呵,挺厉害的。。。
昵称: 剑枫  时间: 2012-01-11 18:29:34
tmkook 发表于 2012-1-11 11:25
才三行我就实现了

哈哈,我感觉你更牛~逗死我了
昵称: action2001  时间: 2012-01-11 23:29:04
拒绝echo,拒绝HTML,拥抱return,拥抱try...catch...
昵称: 北海情书  时间: 2012-01-12 02:18:56
tmkook 发表于 2012-1-11 11:25
才三行我就实现了

哥,服了,

你这算是史上最小php框架了,

三行代码完美实现基本框架控制器功能
昵称: 七月十五  时间: 2012-01-12 09:18:25
路游宝宝 发表于 2012-1-11 11:57
拿去用,BSD 授权。

不厚道,
你这行不如楼上,

过于博大精深了
昵称: dongzide  时间: 2012-01-12 20:54:41
七月十五 发表于 2012-1-12 09:18
拒绝echo,拒绝HTML,拥抱return,拥抱try...catch...

拒绝echo拥抱return就算了,

为何拒绝html,难道try。。。catch能代替html?
昵称: dongzide  时间: 2012-01-12 20:55:23
desand 发表于 2012-1-11 15:39
依我理解 框架之用途:

1.适合敏捷开发

我感觉我这个基本符合你的要求啊
昵称: dongzide  时间: 2012-01-12 20:56:17
我汗,被标题吸引来了,这个也能叫框架?顶多就是一个mvc分层罢了。这个算框架,每个php程序都会开发框架了。无语
昵称: dongzide  时间: 2012-01-12 20:57:07
dongzide 发表于 2012-1-12 20:57
我感觉我这个基本符合你的要求啊

或者吧..

譬如是试试自己(一个人)用这个框架开发一个基本的商城网站
然后又
譬如试试自己管理一个团队用这个框架开发一个基本的商城网站


然后. 就知道了.
昵称: smartfoxbaby  时间: 2012-01-12 21:35:32
require_once 'controllers/'.$_GET['c'].'.php'
$c = new $_GET['c'];
$c->$_GET['m'] ();   
有高手给讲解一下呗 ,我是好学的菜鸟。。。
昵称: desand  时间: 2012-01-13 00:30:07
惊世  {:soso_e153:}
昵称: xiaoyaoyou  时间: 2012-01-13 08:46:31
{:soso_e121:}
昵称: jig68  时间: 2012-01-13 10:23:27
你这个框架还不如url rewrite的功能完善。
昵称: dongzide  时间: 2012-01-13 11:26:55
eleven11 发表于 2012-1-10 14:35
几个建议
1:增加个全局配置的文件,如mysql连接参数都放里面
2:增加全局控制文件,如限制某些ip访问

這個哥哥最後一句我挺起來
昵称: starflash  时间: 2012-01-13 12:13:23
又是学习了。这个好框架真是非常好的说~
昵称: aibuai  时间: 2012-01-13 17:25:29
本帖最后由 Moyo 于 2012-1-13 18:08 编辑
  1. <?php
  2. is_file('c/'.$_GET['c'].'.php') && require 'c/'.$_GET['c'].'.php';
  3. $r = class_exists($_GET['c'], false) ? (new $_GET['c']()) : exit('index');
  4. method_exists($r, $_GET['m']) ? $r->$_GET['m']() : exit('index');
  5. ?>
复制代码
昵称: onlineuser  时间: 2012-01-13 17:46:11
楼上加了判断,逻辑更完善一些
昵称: Moyo  时间: 2012-01-13 18:03:08
人云亦云
昵称: phpin  时间: 2012-01-15 12:56:12
desand 发表于 2012-1-11 15:39
依我理解 框架之用途:

1.适合敏捷开发

确实是,框架是为了开发需求而制定的。
感觉lz涉水不深,但是能自己写点东西有自己的想法,只要自己需要什么样子的框架,也是一个很好的开始。

这个框架确实有点粗糙,如mvc中的c没有做任何过滤,安全相关的东西,这些都是比较初级的问题。

lz慢慢来吧,以后有你要学的东西。有自己的想法固然好,但是别太自大,我做了4年php都不敢说自己精通。。。
昵称: alemic  时间: 2012-01-15 17:23:08
呵呵!讨论的不错
昵称: eleven11  时间: 2012-01-16 10:35:36
占楼
InitPHP2.1 用框架,不骨折
http://initphp.com
昵称: 风起云涌  时间: 2012-01-16 14:00:54
dongzide 发表于 2012-1-12 20:56
拒绝echo拥抱return就算了,

为何拒绝html,难道try。。。catch能代替html?

这个很难解释。
不过如果你有时间去研究一下HTML、XML、JSON编码,看看ExtJS、Dojo等,估计有很大的收获。
昵称: zhuli86122068  时间: 2012-01-17 12:45:39
版主赶快来把“惊世”这个词去掉吧
昵称: 七月十五  时间: 2012-01-19 10:57:32
确实不算框架,不过楼主精神值得学习
昵称: mimizzee  时间: 2012-01-24 14:01:29
虽然听不懂楼主在说什么  但是感觉很厉害的样子。


PS:你的牛逼框架本地包含文件没过滤
昵称: liaoyuan  时间: 2012-01-24 15:46:34
不错,楼主的这个框架进度如何了?
昵称: xuxu  时间: 2012-01-24 17:09:36
@楼主
框架不止是一个分层,还要有自己的一套类库和体系。。
要划分好哪些是底层模块哪些是扩展模块,还要抽象解耦等等。。

当你的框架里常用的功能模块都有的时候才算是框架。。
昵称: wzwen  时间: 2012-01-26 15:54:45
Moyo 发表于 2012-1-13 18:03

强烈支持
建设性代码
昵称: tmkook  时间: 2012-01-31 13:00:53
七月十五 发表于 2012-1-19 10:57
这个很难解释。
不过如果你有时间去研究一下HTML、XML、JSON编码,看看ExtJS、Dojo等,估计有很大的收获 ...

咳,学php好累啊,还要懂htmlxmljsonextjsdojo
昵称: dongzide  时间: 2012-01-31 21:34:30
过年这段时间没上网,楼这么高了,全都是建设性回复,

感谢大家的意见和建议,我会继续完善自己的框架的
昵称: dongzide  时间: 2012-01-31 21:35:29
dongzide 发表于 2012-1-31 21:35
咳,学php好累啊,还要懂htmlxmljsonextjsdojo

看完了HTML、XML、JSON、SOAP、REST、ExtJS、DOJO,你才能扔掉他们,纯粹的深入PHP啊

入门 → 涉猎 → 沉淀
昵称: dongzide  时间: 2012-01-31 21:36:09
看看sinatra什么叫微框架
昵称: 七月十五  时间: 2012-02-01 15:10:03
leric 发表于 2012-2-1 18:00
看看sinatra什么叫微框架

ruby不是已经被抛弃了么???
连twitter都不再用它做开发语言了
昵称: leric  时间: 2012-02-01 18:00:30
{:soso_e147:}
昵称: dongzide  时间: 2012-02-02 14:45:13
的确,框架是为项目服务的。我自己也写过一个框架,耦合度根据团队的分工作业考虑,层次不能太多,但可以灵活调用,实际方便地解决问题就可以了。我认为项目框架不仅仅只是底层的文件,包括js框架,css框架,框架只要bug不太多就算完善了,最适合自己项目的框架都不是可以直接搬来就用的
昵称: linlaoye1988  时间: 2012-02-05 00:10:38
不错 还是有很多好的评论
昵称: AmuroPikin  时间: 2012-02-06 14:43:59
在这里我见识了3行框架,特么牛掰
昵称: zanmaolin  时间: 2012-02-06 17:55:59
{:soso_e121:}
昵称: QQ公馆  时间: 2012-03-25 15:43:09
{:soso_e113:}
昵称: 烟雨一点尘  时间: 2012-03-28 10:49:01
最近也在研究这一块,楼主的东西挺有帮助的,顶一下。。。
昵称: saxier123  时间: 2012-03-29 03:23:53
标题党啊、、、、视图处理,缓存,这些基本的都没。。这只能算类库。何来框架之说。看看我 的 www.ckframework.com
昵称: jopgle6ufi  时间: 2012-03-29 14:11:54
还是可以啊。
昵称: 飞翔的太阳  时间: 2012-03-29 18:18:09
考虑东西太少了。说白了就是简单的对url解析 ,假设用控制台进行 你这个解析不了。提升空间很大
昵称: wujibing  时间: 2012-05-02 07:39:52
哇 强烈支持,楼主好有才啊
昵称: falling  时间: 2012-05-03 19:55:37
看完后,让我思虑很多地方,也有很多地方没看明白具体的原因。
不过楼主的框架能抛出这么多知识点,确实让阅读者收益不少。


我想问一下框架的功能模块应该怎么设计的?
昵称: sanzhongzhifu  时间: 2012-05-05 09:20:30
{:5_249:}
昵称: jyoumei  时间: 2012-05-05 09:42:44
楼主估计 把框架 理解成 项目分布结构了。。。。
昵称: myskl  时间: 2012-05-07 10:08:37
太标题党了。
昵称: 回首过去  时间: 2012-05-07 10:43:28
sanzhongzhifu 发表于 2012-5-5 09:20
考虑东西太少了。说白了就是简单的对url解析 ,假设用控制台进行 你这个解析不了。提升空间很大 ...

啥是php控制台呢??????为何解析不了,说说
昵称: dyl213  时间: 2012-05-08 20:11:44
框架搞的是开发效率,你这个开发效率高吗? 甚至代码都不规范.这个顶多可以说实现了分发请求.至于模板渲染,orm等都未做.也没有考虑设计模式...
昵称: 4664919  时间: 2012-05-10 09:22:55
烟雨一点尘 发表于 2012-3-28 10:49
在这里我见识了3行框架,特么牛掰

再要摇,看得压力山大
昵称: dongzide  时间: 2012-05-14 18:42:02
上当了
昵称: hit9  时间: 2012-05-15 21:18:46