查看: 7209|回复: 40

[原创程序] 惊世php框架2.0,20行实现单点入口自动加载类模型视图控制器

  [复制链接]
发表于 2012-2-20 15:37:14 | 显示全部楼层 |阅读模式
一个php文件实现单点入口自动加载类模型视图控制器
去掉注释只有20行,
/**
*惊世php框架控制器页,
*20120219,版本2.0,
*实现功能:单点入口,自动加载类,控制器,
*类库在class文件夹下,命名方式xxx.class.php,配合mysql数据库连接类、缓存静态文件生成类等其他类库,就是完整的框架
*模型在module文件夹下,命名方式xxx.mod.php,每个mod文件里只有一个class,
*视图在template文件夹下,命名方式xxx.html,和mod同名,若有,自动加载置于mod代码后,
*资源文件存储于src文件夹下,css/js/images.
*/
=============
之前的1.0版本大家给了非常多建议,现在我更新至2.0了,继续讨论继续给点建设性建议和代码吧


  1. <?php
  2. header("Content-type: text/html; charset=utf-8");
  3. //url?赋值给数组$c。
  4. $c = array();
  5. $c['class'] = (!empty($_REQUEST['c']) ? (string)($_REQUEST['c']) : 'index'); //module文件和类名值,为空默认为index
  6. $c['method'] = (!empty($_REQUEST['m']) ? (string)($_REQUEST['m']) : ''); //类方法值,为空默认为index
  7. $c['page'] = (!empty($_REQUEST['p']) ? (int)($_REQUEST['p']) : ''); //分页参数

  8. $fileM = 'module/' . $c['class'] . '.mod.php'; //模块文件路径
  9. $fileT = 'template/' . $c['class'] . '.html'; //模板文件路径

  10. require_once('class/mysql.class.php'); //加载必须的数据库连接类

  11. //如果模块文件、类方法存在则加载和调用,反之不操作。
  12. if(is_file("$fileM"))
  13. {
  14. require("$fileM");
  15. if(method_exists(${$c['class']}, $c['method']))
  16. {
  17. ${$c['class']}->$c['method']();
  18. }
  19. }

  20. //如果模板文件存在则加载,反之不操作
  21. if(is_file("$fileT"))
  22. {
  23. require("$fileT");
  24. }
  25. ?>
复制代码

点评

我欣赏的不是你的"框架",而是你的执着。  发表于 2012-5-3 20:24
我欣赏的不是你的"框架",而是你的执着。  发表于 2012-2-20 16:55

评分

2

查看全部评分

PHPChina社区 PHP开发者社区
 楼主| 发表于 2012-2-20 15:39:31 | 显示全部楼层
求批评,求建设性回复和代码
PHPChina社区 PHP开发者社区
 楼主| 发表于 2012-2-20 15:40:25 | 显示全部楼层
本帖最后由 dongzide 于 2012-2-20 15:51 编辑

机制是根据url参数同时载入module和template,如果有的模块没有模板或者有的模板没有模块,那他们不能同名
url形式为
http://www.abc.com/index.php?c=module&m=fidld&p=123
PHPChina社区 PHP开发者社区
发表于 2012-2-20 15:40:36 | 显示全部楼层

楼主真系叼爆了.
PHPChina社区 PHP开发者社区
发表于 2012-2-20 15:58:59 | 显示全部楼层
http://www.abc.com/index.php?c=module&m=fidld&p=123

http://www.abc.com/index.php?module=fidld&p=123
建议C M两个GET合并成一组, 所有情况都直接占用, 禁止用户_GET获取.
PHPChina社区 PHP开发者社区
 楼主| 发表于 2012-2-20 16:07:08 | 显示全部楼层
本帖最后由 dongzide 于 2012-2-20 16:16 编辑


并成一组怎么搞呢?
一个module类里面如果有多个方法,好像必须单独用个m来传参数调用吧。

如果c和m用一个参数,那好像只有在一个module里面只有一个方法,而且这个方法必须是构造函数时候才可以起作用吧。

你说的这个是怎么做的?
是不是这个意思:www.abc.com/index.php?c=m&p=123
c是类文件,m是类中方法,两个都是活的可变的?这该怎么实现啊,参数都不固定
PHPChina社区 PHP开发者社区
发表于 2012-2-20 16:41:23 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
PHPChina社区 PHP开发者社区
 楼主| 发表于 2012-2-20 16:46:08 | 显示全部楼层
姚三 发表于 2012-2-20 16:41
标题太给力了,楼主太谦虚了,我废话也蛮多了。

来点建设性回复哦
PHPChina社区 PHP开发者社区
发表于 2012-2-20 16:50:41 | 显示全部楼层
我有点儿崇拜楼主了
PHPChina社区 PHP开发者社区
发表于 2012-2-20 16:50:59 | 显示全部楼层
本帖最后由 spser 于 2012-2-20 16:52 编辑
dongzide 发表于 2012-2-20 16:07
并成一组怎么搞呢?
一个module类里面如果有多个方法,好像必须单独用个m来传参数调用吧。

http://free.fenanr.com/index.php?search=index.html
这是调用: c=search&m=index转变后的效果, 是不是更简洁明了? 对SEO还有帮助, 你试想, 百度喜欢永远不变的c=search 还是search=index, 或者user=index ?
对于框架这种已知url结构, 我们发挥想像. 简减get组数, 用户又能够理解.
怎么取C值, 其实就是array_keys() 函数的操作呀, 这是基础.
PHPChina社区 PHP开发者社区
 楼主| 发表于 2012-2-20 17:06:50 | 显示全部楼层
spser 发表于 2012-2-20 16:50
http://free.fenanr.com/index.php?search=index.html
这是调用: c=search&m=index转变后的效果, 是不是更 ...

基本懂了,回头实践下,

本来我想的是url形式无所谓,可以到最后rewrite来改,
我准备改成这种形式:www.aaa.com/p/12332
只有帖子用这种形式,其他页面例如发帖啥的传参多的,不需要搜索引擎检索所以不需要优化。
不过你说这种可以少几行代码,貌似也不错,要用起来。非常建设性
PHPChina社区 PHP开发者社区
 楼主| 发表于 2012-2-20 17:07:57 | 显示全部楼层
qxhy123 发表于 2012-2-20 16:50
我有点儿崇拜楼主了

建设性啊建设性
PHPChina社区 PHP开发者社区
发表于 2012-2-20 17:17:21 | 显示全部楼层
dongzide 发表于 2012-2-20 17:07
建设性啊建设性

先崇拜一下,占位提意见
PHPChina社区 PHP开发者社区
发表于 2012-2-20 17:24:25 | 显示全部楼层
dongzide 发表于 2012-2-20 17:06
基本懂了,回头实践下,

本来我想的是url形式无所谓,可以到最后rewrite来改,

应该不只这么简单.
http://free.fenanr.com/index.php?search=index.html
网站实现伪静态的过程更巧妙.
if($rewrite) // 如果开启了伪静态
strtr($url, array('.php?'=>'/','='=>'/','&'=>'/'));
不仅是index.php, 你换个执行文件, 照样适应, 伪静态只要写一行就搞定.
PHPChina社区 PHP开发者社区
 楼主| 发表于 2012-2-20 18:22:32 | 显示全部楼层
qxhy123 发表于 2012-2-20 17:17
先崇拜一下,占位提意见

赶紧,这边端碗等着呢
PHPChina社区 PHP开发者社区
 楼主| 发表于 2012-2-21 02:19:21 | 显示全部楼层
qxhy123 发表于 2012-2-20 17:17
先崇拜一下,占位提意见

PHPChina社区 PHP开发者社区
 楼主| 发表于 2012-2-21 09:38:06 | 显示全部楼层
{:soso_e135:}
PHPChina社区 PHP开发者社区
 楼主| 发表于 2012-2-21 11:26:25 | 显示全部楼层
{:soso_e117:}
PHPChina社区 PHP开发者社区
发表于 2012-2-21 11:47:48 | 显示全部楼层
提点儿意见,首先,这个东西太不安全了,输入参数居然都不过滤的,只是简单的类型转换了一下,毫无意义;
第二点,文件不存在的时候肿么处理?显示一片空白?总得给开发人员一点儿提示信息吧,不然如何调试.
第三点,类命名不规范,全小写....命名规则各种不规范....
第四点,method_exists只能判断一个方法是否存在,而不能判断这个方法是否可以被调用,这是有本质区别滴
第五点,你写这些东西还不如我直接include一个discuz的common.inc.php文件来的全面,方便

针对你所说的你这只是一个入口文件,就暂时先提这些意见
PHPChina社区 PHP开发者社区
发表于 2012-2-21 12:58:09 | 显示全部楼层
我有点儿崇拜楼主了
PHPChina社区 PHP开发者社区
 楼主| 发表于 2012-2-21 17:54:53 | 显示全部楼层
qxhy123 发表于 2012-2-21 11:47
提点儿意见,首先,这个东西太不安全了,输入参数居然都不过滤的,只是简单的类型转换了一下,毫无意义;
第二点, ...

调试加个else输出就行了

安全过滤准备另外用类实现。

method_exists这个函数只能判断方法是否存在,不能判断方法是否能被调用,那么如何判断方法是否能被调用呢?
PHPChina社区 PHP开发者社区
发表于 2012-2-21 17:57:10 | 显示全部楼层
用得着20行吗,3行就能解决问题,但是有意思吗?需要解决的问题是什么?解决了吗?
PHPChina社区 PHP开发者社区
发表于 2012-3-27 15:06:08 | 显示全部楼层
还是评价一下吧,最近很少上BBS。

楼主是对框架的理解有便差……所谓程序开发框架大意是指为减少程序员工作量而产生的一些代码集合。

而兄台这些动态参数+require 严格意义上并不能称为是框架。

只能说是一种小型项目的一种程序开发实现手段。

在我的理解它更像是一种“代码构架”一种模式…… 如果算的话……
PHPChina社区 PHP开发者社区
发表于 2012-3-28 10:48:27 | 显示全部楼层
单纯的支持一下
PHPChina社区 PHP开发者社区
发表于 2012-5-3 20:29:12 | 显示全部楼层
本帖最后由 大尾巴 于 2012-5-3 20:58 编辑

东子威武!

不过 你require了 module不new
就直接  ${$c['class']}->$c['method']();  了?
另外你 module里的变量如何发给模板的?
直接extract吗?

PHPChina社区 PHP开发者社区
 楼主| 发表于 2012-5-5 00:32:09 | 显示全部楼层
liuxingyuyuni 发表于 2012-3-27 15:06
还是评价一下吧,最近很少上BBS。

楼主是对框架的理解有便差……所谓程序开发框架大意是指为减少程序员工 ...

其实就是用一个文件实现url路由,mvc分层而已。

我感觉这也算框架核心了吧。

就是为了自己开发方便
PHPChina社区 PHP开发者社区
 楼主| 发表于 2012-5-5 00:36:31 | 显示全部楼层
大尾巴 发表于 2012-5-3 20:29
东子威武!

不过 你require了 module不new

很久了,我最近又更新了,

首页路由文件:

你问的如何把数据传给模板。就是首页url路由把模块文件和模板文件一块载入,模块ruturn输出的信息直接返给后面的模板就行了。比较简单

[code=PHP]<?php
/**
*惊世php框架url路由,
*20120501,版本3.0,
*实现功能:单点入口,自动加载类,控制器,
*类库在class文件夹下,命名方式xxx.class.php,配合mysql数据库连接类、缓存静态文件生成类等其他类库,就是完整的框架
*模型在module文件夹下,命名方式xxx.mod.php
*视图在template文件夹下,命名方式xxx.tmp.php
*资源文件存储于src文件夹下,css/js/images.
*/
header("Content-type: text/html; charset=utf-8");

$c = (!empty($_REQUEST['c']) ? (string)($_REQUEST['c']) : 'index'); //控制器参数,url参数$c,如果为空默认值为index。

if(!empty($_REQUEST['p']) && $c = 'index')
{
$post = (int)$_REQUEST['p']; //文章内页id参数
}

if(!empty($_REQUEST['t']) && $c = 'index')
{
$tag = (int)$_REQUEST['t']; //分类标签参数
}

/**
*控制器,用来载入模板输出需要的模块文件
*/
session_start();
require_once('class/mysql.class.php'); //连接数据库
require_once('module/header.mod.php'); //网页头输出数据

if(!empty($post)) //如果url存在参数p
{
require_once('module/content.mod.php');
require_once('template/content.tmp.php');
}

if(!empty($tag)) //如果url参数存在参数t
{
require_once('module/tag.mod.php');
require_once('template/tag.tmp.php');
}

if(empty($post) && empty($tag)) //如果url参数不存在p和t
{
switch ($c)
{
case 'index': //首页(列表页)
require_once('module/index.mod.php');
require_once('template/index.tmp.php');
break;

case 'edit': //编辑发布页面
require_once('template/edit.tmp.php');
break;

case 'editreturn': //编辑发布处理和返回模板页面
require_once('module/edit.mod.php');
require_once('template/return.tmp.php');
break;

case 'login': //登录和注册
require_once('template/login.tmp.php');
break;

case 'loginreturn': //登录处理
require_once('module/login.mod.php');
require_once('template/return.tmp.php');
break;

case 'registerreturn': //用户注册处理
require_once('module/register.mod.php');
require_once('template/return.tmp.php');
break;

default:
echo "控制器参数c switch没找到模块";
}
}
?>[/code]
PHPChina社区 PHP开发者社区
发表于 2012-5-5 00:52:02 | 显示全部楼层
dongzide 发表于 2012-5-5 00:36
很久了,我最近又更新了,

首页路由文件:

1 变量都在公共域下,小心冲突与覆盖
2 用switch来选择模型和模板 , 有100个页面的时候你怎么办?
PHPChina社区 PHP开发者社区
 楼主| 发表于 2012-5-5 10:37:47 | 显示全部楼层
大尾巴 发表于 2012-5-5 00:52
1 变量都在公共域下,小心冲突与覆盖
2 用switch来选择模型和模板 , 有100个页面的时候你怎么办? ...

1 变量都在公共域下,小心冲突与覆盖
何谓公共域,我公共的只有这一个首页文件,

2 用switch来选择模型和模板 , 有100个页面的时候你怎么办?
有100个不同页面,就写100个吧,因为我想模板驱动程序。这样程序功能直接分离性好,基本个个功能之间没任何关系。

另外不不知道别人是怎么做的???
PHPChina社区 PHP开发者社区
发表于 2012-5-5 13:58:20 | 显示全部楼层
spser 发表于 2012-2-20 16:50
http://free.fenanr.com/index.php?search=index.html
这是调用: c=search&m=index转变后的效果, 是不是更 ...

意思是第一次的xx=yy就是c和m,然后后面&的就是传统的GET参数?
PHPChina社区 PHP开发者社区
您需要登录后才可以回帖 登录 | 加入PHPChina

本版积分规则

快速回复 返回顶部 返回列表
 
商务洽谈咨询
洽谈咨询
PHPChina在线客服
PHPChina在线客服