第一篇博文:自用的PHP基础框架

开篇介绍下自己,09年毕业通信专业,后来接触互联网,有点c的基础。从网站编辑做起,seo略懂一些。开始早期公司接触asp,然后做.net,开发过一个Android的应用(java),从.net到php一直到现在。几种语言一直用吧。

  php的框架很多,自学语言开始没接触框架,纯过程式编程。。。自学者接触的知识面总是狭隘了。

  后来用zend framework做过项目,看了一点其他的框架,也一直用.NET MVC。总体对php的框架不慎满意。大多说的互联网需求没有那么丰富,需要的就是快速开发,这也是开源cms流行的原因。同样开源的cms漏洞太多了。。。

  决定自己做一个框架,自己用吧。基本的安全能保障,性能还是不错的,下面具体说一下:

  暂定的框架名称是kaifw,名字无所谓,现在还是就我自己用,框架就几个文件,代码量很少,有几十K大小。

  框架为微型mvc架构,按照文档描述建立相关文件夹,建立mvc应用程序。

目录:
BLL 应用层 负责相关页面处理类
config 配置文件夹 应用程序相关配置,数据库信息,全局信息,路由规则
control 控制层 应用动作处理
function 自定义方法 用户自己开发或第三方服务的引用放置在此
library 库文件 架构相关的核心库文件
public 入口文件 默认的入口模块
TB 表模型 数据库表映射方法的模型
view 视图层 视图文件放在此处

  总控制代码库在library  中,后来function里面加入了memcached扩展类封装,为了性能~下载粘贴一段以前写的说明文字:

说明及规范:
BLL文件夹
内容为业务处理类,在此封装后控制层直接调用。
命名规范:文件与类名相同,类名后缀必须为“_BLL”
config文件夹
内容为应用程序相关配置,数据库信息,全局信息,路由规则
config.php为默认配置数据库和全局信息的文件,配置方法为直接书写键值对:key=‘val‘;
route_config.php为路由配置文件,配置方法参照下面路由配置方法。
其他配置可以自定义。
control文件夹
控制器存放文件夹
默认分区control/public/,可以根据项目需求自定义新分区比如后台用admin,在此建立admin文件夹(control/admin/)
每个控制器类文件名和类名必须相同,并且类名必须继承父类control,例如 class home extends control{}
function文件夹
用户扩展的自定义方法放在此处。还有第三方的服务器引用也放在这里,比如短信接口,邮件接口,支付网银接口等。
library文件夹
框架库文件
core 为核心文件夹
mysql 数据库相关类
document 说明文档
public入口文件夹
此文件夹里面放置入口文件index.php,使用方法见下面入口文件配置。
另外网站使用的静态资源放在这个文件夹下面,此文件为网站的根目录。
比如图片,样式,脚本,富媒体编辑器等
TB数据库表模型
数据表模型,数据库中每个表都在此映射一个类,
类名规范:类名加“_TB”结尾,例如,articles_TB.php,
此表模型类必须继承mtable父类,举例:class articles_TB extends mtable{}
内部已经实现部分方法,在下面的表模型中会详细描述。
view文件夹
此文件夹放置视图文件,路径规则view/分区/控制器/动作

路由规则:
路由规则设置在“config/route_config.php”,示例如下:
Route::addRoute(array(
‘router‘=>"ts/{control}/{action}.html",
‘options‘=>array(
‘area‘=>‘public‘,
‘control‘=>‘control‘,
‘action‘=>‘action‘
),
‘reg‘=>array(
‘area‘=>‘[a-zA-Z0-9_-]+‘,
‘control‘=>‘[a-zA-Z0-9_-]+‘,
‘action‘=>‘[a-zA-Z0-9_-]+‘
)
));
其中Route为路由类,调用静态方法addRoute添加新路由规则。生效顺序为最先添加的最先生效。
参数为数组,其中router是url,要匹配的规则用{key}替换。
options参数为匹配结果的映射,比如上例中分区area在路由中为设置,使用默认值为‘public‘,而control直接匹配url中的“{control}”。
reg参数为匹配类型,默认使用规则‘[a-zA-Z0-9_-]+‘,匹配字母数字下划线。在router中声明的规则{key},必须在此设置对于的正则规则。
入口规则:
入口文件为public/index.php。默认使用单一入口规则。当然你也可根据项目设置多域名,多入口,多分区的复合项目。
默认在入口文件需要引入核心文件,并调用初始化方法。示例如下:
require(dirname(dirname(__FILE__)) . ‘/library/core/core.php‘);
require_once(ROOT_PATH.‘function/sro_function.php‘);
$_C=core::getInstance();
$_C->gotoAction();
在第一行引入核心文件:项目根目录/library/core/core.php.
第二行引入自定义公共方法,自定义的内容写在这里初始化即生效。因为此时系统还未完成初始化。
第三行调用核心静态方法初始化应用。
第四行调用控制器执行应用。
表模型:
在TB文件夹里面设置所有数据表的映射模型,需要遵循以下规范:
继承父类mtable
初始化表信息
public function __construct()
{
parent::__construct(array(‘tableName‘=>‘articles‘,‘tableIndex‘=>‘article_id‘));
}
在表模型类的初始化方法中调用父类初始化方法,传递数组参数。此数据包含两项:表名和表的主键。
注意标模型文件名和表模型类名必须一致,并且表模型类名称为:表名+“_TB”
初始化表模型之后,默认可以使用的方法如下:
$this->find($id);//主键查询数据
$this->getcount($where=‘‘);//返回数据条数,默认为空,返回表中记录数
$this->getIndexDesc($num,$where=‘‘,$columns=‘‘);//按照主键降序排列,查询最新数据。$num返回条数,$where查询条件(可空,不包含where关键词),$columns为查询数据列类型是数据(示例:array(‘id‘,‘name‘))
$this->getIndexAsc($num,$where=‘‘,$columns=‘‘);//同上,按照升序排列,查询最早数据。
$this->getAll($num=‘‘,$where=‘‘,$columns=‘‘);//返回查询数据,参数同上。如需返回数据排序,请在$where中声明 order by条件
$this->page($page,$columns,$where);//分页方法。$page第几页,$where查询条件(可空,不包含where关键词),$columns为查询数据列类型是数据(示例:array(‘id‘,‘name‘))
$this->insert($data);//插入数据。参数$data为二维数组键值对,array(‘name‘=>‘test‘,‘tel‘=>‘123456‘);
$this->update($data,$where);//更新数据。参数$data为二维数组键值对,array(‘name‘=>‘test‘,‘tel‘=>‘123456‘);$where更新条件
$this->updateIndex($data,$id);//根据主键更新数据。参数$data为二维数组键值对,array(‘name‘=>‘test‘,‘tel‘=>‘123456‘);$id为主键值
$this->delete($where);//删除数据。参数$where删除条件
$this->deleteIndex($id);//根据主键删除数据。参数$id为主键值
伪静态设置:
在入口目录public中必须要做伪静态,导引请求进入入口文件。下面举例Apache的.htaccess设置:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
第一行开启伪静态
第二至五行,规定已有文件不做伪静态
第六行,把非静态请求重定向到入口文件(index.php)。
控制器:
控制器在control中,控制器必须继承父类control。
声明动作后,默认在视图中需要建立对应视图页面。
动作中使用$this->view();方法可以跳转视图,如果不调用此方法,系统调用默认此动作的视图。
也可以在view($acton=‘‘,$control=‘‘,$area=‘‘)方法传递参数做视图跳转。
视图:
现在视图中默认使用php代码输出数据,数据必须在控制器的方法中传入。
在视图中可以使用$this->action(‘b‘);调用控制器,会自动载入其中的视图输出内容。

最后:

以前用的是传统的mysql扩展访问数据库,前几天加入了pdo的扩展可选。

支持页面多视图,支持多域名绑定,也可以生成静态页面。。。

基本上的功能都有了,有些功能不好的话也会升级改进。。。

  

时间: 2024-07-31 23:15:22

第一篇博文:自用的PHP基础框架的相关文章

我的第一篇博文:输入法编程

这是我的第一篇博文,在这之前,我要介绍一下我自己.我是一名核电工程师,已经工作了19年,我同时也是一名计算机爱好者.我利用业余时间学习编程. 最近我研究了输入法的编程.我阅读了很多园里的文章,特别是借鉴了启程之星公开的客户端的源码.研究已经取得进展,可惜眼睛看坏了,现在不是很方便用计算机,所以等我眼睛好一些时候,我会更详细地介绍我研究的输入法的心得.我做的几件事如下: 1. 启程之星输入法源码的主要原理搞懂了.编译成功,知道主要部分的逻辑关系: 2. 研究了启程之星最近版与服务器通讯的原理(此部

这是我的第一篇博文,请大家多多关照!~

最近发现MDT推出去的系统的有不同问题,其问题就不说了,主要是策略权限被域继承了.比如我们手动安装的很多东东都是未配置壮态,推的就默认为安全壮态了,今天细找了一下,原来把这个关了就可以了. 这是我的第一篇博文,请大家多多关照!~,布布扣,bubuko.com

2015元旦第一篇博文:Red5流媒体服务器搭建

今天是2015年的第一天,白天陪老婆孩子去BHG(华联)转了转,中午在九毛九吃了顿午饭,就这样过了元旦,虽然有点累,但是挺开心,北京今天的天气也比较给力,风和日丽,没有雾霾!现在是晚上十点,因为白天出去玩,老婆孩子有点累,现在已经熟睡,我不想就这样就结束2015的第一天,作为一个新的开始,我决定写2015年的第一篇博文.闲话少说,进入主题.流媒体这个概念在第一家公司就了解了,当时做一个Eleaning在线教育平台的时候,用Red5流媒体服务器技术,支持过视频模块的播放.下面就谈谈我对流媒体的认识

第一篇博文:为自己加油

为自己加油 第一次在51CTO发表博文,四个字形容我和51CTO的关系"相见恨晚",今年才正式的了解和加入,并开始在51CTO学院学习在线课程.起步有点晚,也没有关系,找对了方向,一切都不晚. 来点抒情的正能量的文字,鼓励下自己,继续学习的动力. 改变才能更好的生存,学习是改变的最佳途径! 还有我最喜欢的一句哈佛名言:Thought is already is late,exactly is the earliest time ! 和大家一起共勉. 2014年05月09日 晚 20点4

我的第一篇博文

看着很多朋友都开通了自己的博客,在博客里写写画画蛮有意思,自己也开博了,原来的科学网博客太八卦了,以后长居博客园了. 试着写个数学公式 我的第一篇博文,布布扣,bubuko.com

我的第一篇博文--程序员的成长

如果你是一名程序员,那么我想恭喜你,你成为了为数不多的新型人类.程序员,在我看来,它是个很棒的代名词,但是想成为真正的程序员,很不容易,真的很累的. 每天挑代码到凌晨3,4点,这不是虚的,写了改,改了重写,查代码,测代码,找bug,反反复复,像是覆水难收. 现在,我得去上课去了,培训.回来继续 我的第一篇博文--程序员的成长

Python之路,第一篇:Python入门与基础

第一篇:Python入门与基础 1,什么是python? Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. 2,python的特征: (1)易于学习,易于利用: (2)开发效率高,内建众多数据类型,强大的标准库支持: (3)高级语言: (4)可移植性,基于开放源代码特性 (5)可扩展性,如果你需要一段运行很快的关键代码,或者是想要编写一些不愿开放的算法,你可以使用C或C++完成那部分程序,然后从你的Python程序中调用. (6)可嵌入,你可以将Python嵌入到C

致我的第一篇博文

前言:敲代码也一定的时间了,所谓好记性不如烂笔头,所以大家快写自己的博文吧. 第一篇还真不知道如何下笔,感觉高中时期把自己肚子里的货全部都半空了,大学基本上就没出货了,追忆往事,我高中的文笔还是不错的,高考语文快130分了,一把辛酸一把泪,现在真是能憋死英雄汉. 所以文章还是要写的,现在入行程序员,项目上的一些积累还是需要整理的,自己平时学的东西啊,书籍啊,多写写笔记也是不错的,第一篇也不需要长篇大论什么的,开头就写给自己:现在的你水平有限,你要加油啊! ps:糖小宝,我爱你!我会加油的!

第一篇---------c语言的一些基础零碎知识所思所想

首先,我的博客地址是http://www.cnblogs.com/naiwenmoer/,这也是我第一篇博客,以前没想过写博客,现在有幸加入这个大神遍地飞的园子,还请各位大神多多指教了! c语言作为经典语言,这里不再多说了.咱从基础一起探讨吧! 一. 定义一个整型,如果作为局部变量,没有初始化的情况下,它是一个随机的值的,一般情况下输出会是0,但这个0是作为垃圾值的;而如果作为全局变量,没有初始化的情况下,它的值是0. 二.我们都知道,static是用于声明一个内部全局变量,在使用static的

我的第一篇博文(Winfrom下WebBrowser控件的使用)

说实话来到博客园也得2年多了,可惜一片文章都没写过.只因今天心情很不好,决定趁工休时间写篇博文放松放松.文字真的是一件很神奇的东西,写出来了感觉心情会好很多.我现在有个想法就是把我总结的一些技术性的东西以后慢慢地放到博客园上来. 今天心情为什么心情不好呢,因为早晨我迟到了.这次迟到估计是我本月内第三次迟到了,好害怕公司通报啊.由于路上修路,今早得绕道.平时也就是20分钟的路程,今早居然用了40分钟.靠,为什么堵车啊,为什么总是在右转或者左转的时候那么堵.看红绿灯那么偏向直行的车,我真想踹门砸玻璃