+ -
当前位置:首页 → 问答吧 → 惊世php框架,一个文件,40行代码,基本框架功能全实现

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

时间:2012-01-10

来源:互联网

本帖最后由 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

怎么样,大家给点建议,再优化下,
下面给个这个框架的实际案例。

程序文件系统:
class (放类库)
module (放模块)
template (放模板)
public (放图片、js、css)
index.php (根目录下就这个文件,控制器)

作者: dongzide   发布时间: 2012-01-10

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

LZ你这太初级了  慢慢搞吧 跟项目理解有关系  立足于功能是看不到的

作者: 北漂   发布时间: 2012-01-10

本帖最后由 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

好了,一个功能完整的记事本完成了。

很简单。

自己写的框架,就是好使,大家给点建议吧

作者: dongzide   发布时间: 2012-01-10

北漂 发表于 2012-1-10 14:03
LZ你这太初级了  慢慢搞吧 跟项目理解有关系  立足于功能是看不到的

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

何来初级一说???

不妨说说高级的框架,都有啥高级功能,我这个初级的,有什么值得改进的地方?

作者: dongzide   发布时间: 2012-01-10

几个建议
1:增加个全局配置的文件,如mysql连接参数都放里面
2:增加全局控制文件,如限制某些ip访问
3:增加全局函数文件,如一些常用的函数,比如格式化时间,当然了这些放在class里也是不错的。
4:p这个参数如果是分页符的话,建议也放在class里,吧样式都加进去,以后会方便。
5:public里不建议放图片,建议你提出来,好处有几点,如文件过多,可做个磁盘挂在点。而且过多的图片放在一个文件夹里会影响速度,建议文件夹命名搞个冒泡算法。

提倡自己写框架,开源的功能太多,n多都用不上,而且了解代码比自己写还浪费时间。

作者: eleven11   发布时间: 2012-01-10

eleven11 发表于 2012-1-10 14:35
几个建议
1:增加个全局配置的文件,如mysql连接参数都放里面
2:增加全局控制文件,如限制某些ip访问

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

你说这些功能改进,我慢慢研究,暂时用不到的可以以后改版再添加进去,目前先关注急需的功能,把站先搞出来

作者: dongzide   发布时间: 2012-01-10

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

何来惊世之说,务实点好。

作者: xiaochong0302   发布时间: 2012-01-10

被标题骗进来了。。。。。

作者: hooyooo   发布时间: 2012-01-10

越用框架感觉越会被限制…
进来用框架越来越不给力了…

作者: xuan20070am   发布时间: 2012-01-10

xiaochong0302 发表于 2012-1-10 14:56
何来惊世之说,务实点好。

给点建议也好

作者: 迷失羔羊   发布时间: 2012-01-10

hooyooo 发表于 2012-1-10 15:10
被标题骗进来了。。。。。

不惊世你不进来啊,没办法,给点意见吧

作者: dongzide   发布时间: 2012-01-10

xuan20070am 发表于 2012-1-10 15:10
越用框架感觉越会被限制…
进来用框架越来越不给力了…

自写自用框架就没有这个问题吧

作者: dongzide   发布时间: 2012-01-10

LZ等你真正写出一款框架就明白了,框架解决的事情不是功能,而是对项目工程的控制的一种解决方案,为了几个类而写框架,那不叫框架而是脚本。
我只问你几个问题,项目中经常遇见的模型对象耦合度,你是怎么处理的?框架的层次你打算怎么做?做的话有什么特点?项目对于框架要求的重点在什么地方?
细节点的:一个对象,你觉得是需要实例化和非实例化?载入的文件你是怎么做优化的?
.......
太多了,不要提惊世,务实点多好,框架要解决的问题,绝对不是脚本的问题,而是项目的问题。

作者: dongzide   发布时间: 2012-01-10

本帖最后由 dongzide 于 2012-1-10 17:03 编辑
北漂 发表于 2012-1-10 15:45
LZ等你真正写出一款框架就明白了,框架解决的事情不是功能,而是对项目工程的控制的一种解决方案,为了几个 ...


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

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

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

考虑下你的建议

作者: 北漂   发布时间: 2012-01-10

本帖最后由 北漂 于 2012-1-10 17:19 编辑

根据你上面回答的答案,你写的是脚本  不是框架  真正的框架,只有写过了才会体会,需要解决的不是脚本层面的东西。

作者: dongzide   发布时间: 2012-01-10

最浅显的就是。框架都是服务于项目诉求的,比如敏捷开发,比如易用的可扩展性

而楼主你的东西无非就是弄了一个简单的路由。说框架还差得远。

作者: 北漂   发布时间: 2012-01-10

{:soso_e113:} 标题党

作者: magki   发布时间: 2012-01-11

  1. require_once 'controllers/'.$_GET['c'].'.php'
  2. $c = new $_GET['c'];
  3. $c->$_GET['m'] ();
复制代码
才三行我就实现了

作者: kilobug   发布时间: 2012-01-11

  1. <?php
复制代码
拿去用,BSD 授权。

作者: tmkook   发布时间: 2012-01-11

依我理解 框架之用途:

1.适合敏捷开发
2.可以满足团队开发, 例如MVC 分开啊, 功能模块分开权限啊...
3.框架好坏应该要考虑到是否适合项目管理.
4....

作者: 路游宝宝   发布时间: 2012-01-11

额 都是牛叉人物 40行到3行

作者: desand   发布时间: 2012-01-11

自己用用就算了,通用型框架比较难做的。。

作者: 天外飞仙   发布时间: 2012-01-11

标题党,拉出去枪毙十分钟{:soso__5069351604328262862_1:}

作者: shmiya   发布时间: 2012-01-11

呵呵,挺厉害的。。。

作者: 剑枫   发布时间: 2012-01-11

tmkook 发表于 2012-1-11 11:25
才三行我就实现了

哈哈,我感觉你更牛~逗死我了

作者: action2001   发布时间: 2012-01-11

拒绝echo,拒绝HTML,拥抱return,拥抱try...catch...

作者: 北海情书   发布时间: 2012-01-12

tmkook 发表于 2012-1-11 11:25
才三行我就实现了

哥,服了,

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

三行代码完美实现基本框架控制器功能

作者: 七月十五   发布时间: 2012-01-12

路游宝宝 发表于 2012-1-11 11:57
拿去用,BSD 授权。

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

过于博大精深了

作者: dongzide   发布时间: 2012-01-12

七月十五 发表于 2012-1-12 09:18
拒绝echo,拒绝HTML,拥抱return,拥抱try...catch...

拒绝echo拥抱return就算了,

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

作者: dongzide   发布时间: 2012-01-12

desand 发表于 2012-1-11 15:39
依我理解 框架之用途:

1.适合敏捷开发

我感觉我这个基本符合你的要求啊

作者: dongzide   发布时间: 2012-01-12

我汗,被标题吸引来了,这个也能叫框架?顶多就是一个mvc分层罢了。这个算框架,每个php程序都会开发框架了。无语

作者: dongzide   发布时间: 2012-01-12

dongzide 发表于 2012-1-12 20:57
我感觉我这个基本符合你的要求啊

或者吧..

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


然后. 就知道了.

作者: smartfoxbaby   发布时间: 2012-01-12

require_once 'controllers/'.$_GET['c'].'.php'
$c = new $_GET['c'];
$c->$_GET['m'] ();   
有高手给讲解一下呗 ,我是好学的菜鸟。。。

作者: desand   发布时间: 2012-01-13

惊世  {:soso_e153:}

作者: xiaoyaoyou   发布时间: 2012-01-13

{:soso_e121:}

作者: jig68   发布时间: 2012-01-13

你这个框架还不如url rewrite的功能完善。

作者: dongzide   发布时间: 2012-01-13

eleven11 发表于 2012-1-10 14:35
几个建议
1:增加个全局配置的文件,如mysql连接参数都放里面
2:增加全局控制文件,如限制某些ip访问

這個哥哥最後一句我挺起來

作者: starflash   发布时间: 2012-01-13

又是学习了。这个好框架真是非常好的说~

作者: aibuai   发布时间: 2012-01-13

本帖最后由 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

楼上加了判断,逻辑更完善一些

作者: Moyo   发布时间: 2012-01-13

人云亦云

作者: phpin   发布时间: 2012-01-15

desand 发表于 2012-1-11 15:39
依我理解 框架之用途:

1.适合敏捷开发

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

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

lz慢慢来吧,以后有你要学的东西。有自己的想法固然好,但是别太自大,我做了4年php都不敢说自己精通。。。

作者: alemic   发布时间: 2012-01-15

呵呵!讨论的不错

作者: eleven11   发布时间: 2012-01-16

占楼
InitPHP2.1 用框架,不骨折
http://initphp.com

作者: 风起云涌   发布时间: 2012-01-16

dongzide 发表于 2012-1-12 20:56
拒绝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

Moyo 发表于 2012-1-13 18:03

强烈支持
建设性代码

作者: tmkook   发布时间: 2012-01-31

七月十五 发表于 2012-1-19 10:57
这个很难解释。
不过如果你有时间去研究一下HTML、XML、JSON编码,看看ExtJS、Dojo等,估计有很大的收获 ...

咳,学php好累啊,还要懂htmlxmljsonextjsdojo

作者: dongzide   发布时间: 2012-01-31

过年这段时间没上网,楼这么高了,全都是建设性回复,

感谢大家的意见和建议,我会继续完善自己的框架的

作者: dongzide   发布时间: 2012-01-31

dongzide 发表于 2012-1-31 21:35
咳,学php好累啊,还要懂htmlxmljsonextjsdojo

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

入门 → 涉猎 → 沉淀

作者: dongzide   发布时间: 2012-01-31

看看sinatra什么叫微框架

作者: 七月十五   发布时间: 2012-02-01

leric 发表于 2012-2-1 18:00
看看sinatra什么叫微框架

ruby不是已经被抛弃了么???
连twitter都不再用它做开发语言了

作者: leric   发布时间: 2012-02-01

{:soso_e147:}

作者: dongzide   发布时间: 2012-02-02

的确,框架是为项目服务的。我自己也写过一个框架,耦合度根据团队的分工作业考虑,层次不能太多,但可以灵活调用,实际方便地解决问题就可以了。我认为项目框架不仅仅只是底层的文件,包括js框架,css框架,框架只要bug不太多就算完善了,最适合自己项目的框架都不是可以直接搬来就用的

作者: linlaoye1988   发布时间: 2012-02-05

不错 还是有很多好的评论

作者: AmuroPikin   发布时间: 2012-02-06

在这里我见识了3行框架,特么牛掰

作者: zanmaolin   发布时间: 2012-02-06

{:soso_e121:}

作者: QQ公馆   发布时间: 2012-03-25

{:soso_e113:}

作者: 烟雨一点尘   发布时间: 2012-03-28

最近也在研究这一块,楼主的东西挺有帮助的,顶一下。。。

作者: saxier123   发布时间: 2012-03-29

标题党啊、、、、视图处理,缓存,这些基本的都没。。这只能算类库。何来框架之说。看看我 的 www.ckframework.com

作者: jopgle6ufi   发布时间: 2012-03-29

还是可以啊。

作者: 飞翔的太阳   发布时间: 2012-03-29

考虑东西太少了。说白了就是简单的对url解析 ,假设用控制台进行 你这个解析不了。提升空间很大

作者: wujibing   发布时间: 2012-05-02

哇 强烈支持,楼主好有才啊

作者: falling   发布时间: 2012-05-03

看完后,让我思虑很多地方,也有很多地方没看明白具体的原因。
不过楼主的框架能抛出这么多知识点,确实让阅读者收益不少。


我想问一下框架的功能模块应该怎么设计的?

作者: sanzhongzhifu   发布时间: 2012-05-05

{:5_249:}

作者: jyoumei   发布时间: 2012-05-05

楼主估计 把框架 理解成 项目分布结构了。。。。

作者: myskl   发布时间: 2012-05-07

太标题党了。

作者: 回首过去   发布时间: 2012-05-07

sanzhongzhifu 发表于 2012-5-5 09:20
考虑东西太少了。说白了就是简单的对url解析 ,假设用控制台进行 你这个解析不了。提升空间很大 ...

啥是php控制台呢??????为何解析不了,说说

作者: dyl213   发布时间: 2012-05-08

框架搞的是开发效率,你这个开发效率高吗? 甚至代码都不规范.这个顶多可以说实现了分发请求.至于模板渲染,orm等都未做.也没有考虑设计模式...

作者: 4664919   发布时间: 2012-05-10

烟雨一点尘 发表于 2012-3-28 10:49
在这里我见识了3行框架,特么牛掰

再要摇,看得压力山大

作者: dongzide   发布时间: 2012-05-14

上当了

作者: hit9   发布时间: 2012-05-15