PHP中的各种框架
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP中的各种框架相关的知识,希望对你有一定的参考价值。
CodeIgniter、Cakephp、ZendFramework、Symfony这几个是国外的,你可以参考下http://www.isstudy.comCodeIgniter
优点:
1. 配置简单,全部的配置使用PHP脚本来配置,执行效率高;具有基本的路由功能,能够进行一定程度的路由;具有初步的Layout功能,能够制作一定程度的界面外观;数据库层封装的不错,具有基本的MVC功能
2. 快速简洁,代码不多,执行性能高,框架简单,容易上手,学习成本低,文档详细;自带了很多简单好用的library,框架适合小型应用
缺点:
1. 把Model层简单的理解为数据库操作
2. 框架略显简单,只能够满足小型应用,略微不太能够满足中型应用需要
评价:
总体来说,拿CodeIgniter来完成简单快速的应用还是值得,同时能够构造一定程度的layout,便于模板的复用,数据操作层来说封装的不错,并且CodeIgniter没有使用很多太复杂的设计模式,执行性能和代码可读性上都不错。至于附加的 library 也还不错,简洁高效。
CakePHP
优点:
1. CakePHP是最类似于RoR的框架,包括设计方式,数据库操作的Active Record方式;设计层面很优雅,没有自带多余的 library,所有的功能都是纯粹的框架,执行效率还不错;数据库层的 hasOne, hasMany 功能很强大,对于复杂业务处理比较合适;路由功能,配置功能还不错;自动构建脚手架(scaffold)很强大;适合中型应用;基本实现过了MVC每一层;具有自动操作命令行脚本功能;
2. 文档比较全,在国内推广的比较成功,大部分都知道CakePHP,学习成本中等
缺点:
1. CakePHP非常严重的问题是把Model理解为数据库层操作,严重影响了除了数据库之外的操作能力
2. CakePHP的cache功能略显薄弱,配置功能稍嫌弱;CakePHP不适合大型应用,只适合中型应用,小型应用来说略微的学习成本高了点
评价:
总体来说CakePHP框架代表了PHP框架很重要的一个时代和代表,并且目前发挥着很重要的作用,不少自己写的框架都模仿了CakePHP的方式,是个里程碑式的产品;CakePHP透露着RoR的敏捷开发方式和把数据库操作认为是唯一Model的设计思想,作为开发快速应用和原型是绝好的工具;同样,用来做Web2.0网站的开发框架,也是值得选择的。
【 Zend Framework 】
优点:
1. 官方出品,自带了非常多的 library,框架本身使用了很多设计模式来编写,架构上很优雅,执行效率中等;MVC设计中,比较简洁,具有路由功能,配置文件比较强大(能够处理 XML和php INI),各种 library 很强大,是所有PHP框架中各种功能最全面的,包括它不仅是一个框架,更是一个大类库(取代PEAR),这是它的主要特色;能够直观的支持除数据库操作之外的Model层(比 CodeIgniter 和 CakePHP 强),并且能够很轻易的使用Loader功能加载其他新增加的Class;Cache功能很强大,从前端Cache到后端Cache都支持,后端 Cache支持Memcache、APC、SQLite、文件等等方式;数据库操作功能很强大,支持各种驱动(适配器)
2. 文档很全,在国内社区很成熟,并且目前不少Web 2.0网站在使用,学习成本中等
缺点:
1. MVC功能完成比较弱,View层简单实现(跟没实现一样),无法很强大的控制前端页面
2. 没有自动化脚本,创建一个应用,包括入口文件,全部必须自己手工构建,入门成本高
3. Zend Framework 作为一个中型应用框架问题不大,也能够勉强作为大型应用的框架,但是作为一个很成熟的大型PHP框架来说,还需要一些努力
评价:
作为官方出品的框架,Zend Framework的野心是可以预见的,想把其他框架挤走,同时封装很多强大的类库,能够提供一站式的框架服务,并且他们的开发团队很强大,完全足够有能力开发很强大的产品出来,所以基本可以确定的是Zend Framework前途无量,如果花费更多的时间去完善框架。同样的,Zend Framework架构本身也是比较优雅的,说明Zend官方是有很多高手的,设计理念上比较先进,虽然有一些功能实现的不够完善,比如View层,自动化脚本等等,这些都有赖于未来的升级。总体来说Zend Framework是最值得期待的框架,当然,你目前要投入你的项目中使用也是完全没问题的。
【 Symfony 】
优点:
1. Symfony 是我了解的PHP框架中功能最强大的,而且我使用时间比较长,但是很多功能还是没有挖掘出来;它完整实现了MVC三层,封装了所有东西,包括 $_POST,$_GET 数据,异常处理,调试功能,数据检测;包含强大的缓存功能,自动加载Class(这个功能很爽),强大的i18n国家化支持;具有很强大的view层操作,能够零碎的包含单个多个文件;非常强大的配置功能,使用yml配置能够控制所有框架和程序运行行为,强大到让人无语;能够很随意的定义各种自己的 class,并且symfony能够自动加载(auto load)这些class,能够在程序中随意调用;包含强大的多层级项目和应用管理:Project --> Application --> Module --> Action,能够满足一个项目下多个应用的需要,并且每层可以定义自己的类库,配置文件,layout;非常强大的命令行操作功能,包括建立项目、建立应用、建立模块、刷新缓存等等;
2. Symfony绝对是开发大型复杂项目的首选,因为使用了Symfony,将大大节约开发成本,并且多人协作的时候,不会出现问题,在Project级别定义好基础Class以后,任何模块都能够重用,大大复用代码
缺点:
1. 数据库操作model采用了重量级的propel和creole,不过在我测试的版本中已经把他们移到了addon里,可用可不用
2. 缓存功能无法控制,每次开发调试总是缓存,需要执行 symfony cc, symfony rc 来清除和重建缓存;
3. 效率不是很高,特别是解析模板和读取配置文件的过程,花费时间不少;
4. 学习成本很高,并且国内没有成熟的社区和文档,连中文手册都没有,相应的要掌握所有功能,需要花费比较多的时间
评价:
Symfony绝对是企业级的框架,唯一能够貌似能够跟Java领域哪些强悍框架抗衡的东西;强悍的东西,自然学习复杂,但是相应的对项目开发也比较有帮助,自然是推荐复杂的项目使用Symfony来处理,觉得是值得,后期的维护成本比较低,复用性很强。相应的如果使用Symfony的应该都是比较复杂的互联网项目,那么相应的就要考虑关于数据库分布的问题,那么就需要抛弃Symfony自带的数据库操作层,需要自己定义,当然了,Symfony支持随意的构造model层。
【 总评 】
以上数款框架,各有特色,而且都是开源项目,不过框架针对的项目不一样,一般来说 CodeIngiter 比较适合小型项目,CakePHP 和 Zend Framework 比较适合中型项目,Symfony 比较适合大型重量级项目,在项目选型的时候,要充分考虑框架的可以定制性、扩展性,因为每个项目都无法确定你是否会随着需求的变化进行改变。
相对来说,Zend Framework 和 Symfony 应对变化的能力比较强,特别是能够随意定制 model 层的Class,能够非常方便增加自己业务或者数据处理类,我是个人比较推荐在中大型项目中使用的框架。CodeIngiter 和 CakePHP 在中小型项目中同样能够发挥重大作用,快速开发和原型构建,非常适合目标不清晰的原型项目的开发。了解一个框架最好的方式就是使用它,学习它最好的方式就是看视频。
仁者见仁,智者见智,在项目挑选框架的时候,请先认真考察项目的需求和未来的变化,然后选择合适的框架,让项目开发速度和后期维护性得到一个合理的平衡,当然了,也许,自己写一个框架更适合。 参考技术A 比较常用的有vi,ci,zend_framwork,还有thinkphp框架,这些都是常用的..望采纳
TP框架对数据库的基本操作
数据库的操作,无疑就是连接数据库,然后对数据库中的表进行各种查询,然后就是对数据的增删改的操作,一步步的讲述一下框架对数据库的操作
想要操作数据库,第一步必然是要:链接数据库
一、链接数据库
(1)找到模块文件夹中的Conf文件夹,然后进行编写config.php文件
我这里是这样的文件路径
(2)打开这个config.php文件,然后找到父类配置文件convention.php文件,将关于"数据库"的部分复制粘贴到config.php配置文件中
1
2
3
4
5
6
7
8
9
|
/* 数据库设置 */ \'DB_TYPE\' => \'\' , // 数据库类型 \'DB_HOST\' => \'\' , // 服务器地址 \'DB_NAME\' => \'\' , // 数据库名 \'DB_USER\' => \'\' , // 用户名 \'DB_PWD\' => \'\' , // 密码 \'DB_PORT\' => \'\' , // 端口 \'DB_PREFIX\' => \'\' , // 数据库表前缀 \'DB_FIELDS_CACHE\' => true, // 启用字段缓存(开发时这个要写成false) |
下面是我的数据库连接内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<?php return array ( //\'配置项\'=>\'配置值\' /* 数据库设置 */ \'DB_TYPE\' => \'mysql\' , // 数据库类型 \'DB_HOST\' => \'localhost\' , // 服务器地址 \'DB_NAME\' => \'test3\' , // 数据库名 \'DB_USER\' => \'root\' , // 用户名 \'DB_PWD\' => \'123\' , // 密码 \'DB_PORT\' => \'3306\' , // 端口 \'DB_PREFIX\' => \'\' , // 数据库表前缀 \'DB_FIELDS_CACHE\' => false, // 启用字段缓存(开发时这个要是false) ); |
连接成功后,然后就是新建模型文件了
二、新建模型文件(具体内容看ThinkPhp框架知识)
(1)找到模块文件夹中的Model文件夹,然后在这个文件夹新建模型文件
a) model本身就是一个类文件
b) 数据库中的每个数据表都对应一个model模型文件
c) 最简单的数据model模型类
自己的模型文件
1
2
3
4
5
6
7
|
<?php namespace Home\\Model; //命名空间的写法 use Think\\Model; //使用模型 class InfoModel extends Model { } |
(2)看下这个数据模型
我们可以再控制器文件夹中进行编写控制文件,这里有了一个控制文件,我就用这个了
打开控制文件,然后写个方法,这里叫做ceshi()
1
2
3
4
5
6
|
public function ceshi() { $info = new \\Home\\Model\\InfoModel(); //造新对象,这里是Info模型 var_dump( $info ); //输出一下,看下结果 } |
出看一下结果,注意这里地址栏的写法(在框架知识中已经介绍过了4中访问方式了):
这是我的路径:
下面是对应的模型数据:
三、对数据库进行各种查询(下面的是ThinkPHP模型基础类提供的“连贯操作方法”连贯操作方法)
可以利用这个控制文件中的方法,就直接在这个方法中写了
1
2
3
4
5
6
|
public function ceshi() { $info = new \\Home\\Model\\InfoModel(); //造新对象,这里是Info模型 //下面是数据库操作 } |
(1)查询表中的所有数据(方法:select())
返回的二维数组(关联的)
返回的数据其中的字段名称是小写,这样做数据库时尽量是小写的
例如:
1
2
|
$arr = $info ->select(); var_dump( $arr ); |
看下是不是查询的数据库中所有内容
数据库中的内容:
(2)查询一条数据(方法:find())
例如:
1
|
$arr = $info ->find( "p002" );<br>var_dump( $arr ); |
这是查询的:代号是"p002"的信息,如下:
select()方法也是可以查询一条或是多条数据,如下:
1
2
|
$arr = $info ->select( "p001,p002" ); var_dump( $arr ); |
这是查询的:代号是"p001"和"p002"的信息,如下:
(3)条件查询数据(方法:where())
1
|
$arr = $info ->where( "code=\'p003\'" )->select();<br>var_dump( $arr ); |
这是查询的条件:代号是p003的所有信息
(4)切换数据表(方法:table())
例如:
1
|
$arr = $info ->table( "nation" )->select();<br>var_dump( $arr ); |
这是却换了一张nation表:
(5)选择操作的字段(方法:field())
例如:
1
|
$arr = $info ->field( "name,sex,birthday" )->select();<br>var_dump( $arr ); |
查询字段是:姓名、性别和生日的字段
(6)对数据进行排序(方法:order())
例如:
1
2
|
$arr = $info ->order( "code desc" )->select(); var_dump( $arr ); |
这是对code进行降序排列
(7)分页查询数据(方法:limit()和page())
例如:limit()
1
2
|
$arr = $info ->limit( "2,2" )->select(); var_dump( $arr ); |
这是显示的第2页的内容:
例如:page()
1
2
|
$arr = $info ->page( "2,2" )->select(); var_dump( $arr ); |
这个也是显示的第2页的内容:
注意:
limit()和page()的不同之处:后者的参数是直接显示“第几页”,“几条”
(8)对数据进行分组(方法:table())
例如:
1
2
|
$arr = $info ->table( "car" )->field( "max(price)" )->group( "brand" )->select(); var_dump( $arr ); |
这是查询的car表中的最大价格,并且根据brand的字段进行分组
例如:
1
2
|
$arr = $info ->table( "car" )->field( "max(price)" )->group( "brand" )->having( "max(price)>60" )->select(); var_dump( $arr ); |
这是上面的那个查询,但是加了一个条件就是价格大于60的
(9)链接查询数据库(方法:join())
例如:
1
2
|
$arr = $info ->field( "info.code as \'代号\', info.name as \'姓名\',nation.name as \'民族\'" )->join( "nation on info.nation=nation.code" )->select(); var_dump( $arr ); |
这是链接查询的两张表(汉语的地方最后用字符,因为后面要用到他的
(10)去重(distinct())
例如:
1
2
|
$arr = $info ->table( "car" )->distinct(true)->field( "brand" )->select(); var_dump( $arr ); |
这是查询的数据库中重复的字段
到此,就是关于怎么连接数据库和各种查询数据库中的数据,这是基本操作,下面就是对数据的添加、修改、删除操作了
四、对数据表添加数据(方法:add())
(1)上一篇已经讲过链接数据库了,继续进行对数据库的操作,还是用控制器文件中的HomeController.class文件
看下数据库表中的现有数据,然后在进行添加数据
添加数据有三种方法
其中第一种和第二种的添加数据方法不用判断语句,直接找到表然后进行编写就可以
1
2
3
4
|
public function tianjia() { $n = M( "nation" ); <br> //下面就是第一种和第二种添加的方式 } |
1.使用数组方式添加
1
2
3
4
|
//1.使用数组方式添加 $arr = array ( "Code" => "n006" , "Name" => "哈喽" ); //其中的字段名要和数据库中的要保持一致 $n ->add( $arr ); //进行添加数据,方法add() |
运行一下这个方法,注意地址栏要使用正确的路径(这是我的路径):http://localhost/tp/index.php/Home/Home/tianjia
看下数据库表中是否添加了数据
2.AR方式
赋一下值(给字段赋值然后在添加)
1
2
3
4
|
//2.AP方式 $n ->Code = "n007" ; //赋值的方式将每个字段赋值 $n ->Name = "你好" ; $n ->add(); //最后用添加方法的时候里面就不用写参数了 |
运行看下数据库表中的变化
3.自动收集表单(最简单的方式)
注意事项:
(1)表单中的name要和数据库中的字段名统一
(2)多余的表单可以自动取名,只要不和数据库字段名一样就可以
就要考虑这个操作方法要实现什么逻辑,要是两个逻辑
1.显示页面
2.添加数据
这里可以通过if判断语句来实现:如果是空的,就显示页面
1
2
3
4
|
if ( empty ( $_POST )) { $this ->show(); //显示页面 } |
否则就是添加数据的代码,一步步的来,先说显示页面,既然是显示页面就要在视图文件夹添加显示页面了
1.1.打开View文件夹,然后新建文件夹,名字和控制器的名字一样
1.2.然后在Home文件夹中新建一个显示页面,这里我叫的是tianjia.html,打开这个页面,进行编写要显示的内容
这里我是用的表单元素来写的显示页面
1
2
3
4
5
6
|
<form action= "__ACTION__" method= "post" > <!--这个中的ation属性使用的__ACTION__(当前操作方法),也可以使用__SELF__(自身的操作方法)系统常量--><br> <!--注意下面的name名字要和数据中的保持一致--> <div>代号:<input type= "text" name= "Code" /></div> <br /> <div>名称:<input type= "text" name= "Name" /></div> <input type= "submit" value= "添加" /> </form> |
注意:
这样,我们访问一下,看看是不是能够看到这个页面
打开浏览器,在地址栏中输入访问方法
http://localhost/tp/index.php/Home/Home/tianjia
看下这个页面的显示效果
显示页面成功后就是添加数据的编写了
2.1这个就是判断中的“否则”的语句了
1
2
3
4
5
6
|
else { $n = M( "nation" ); $n ->create(); //自动收集表单数据 $n ->add(); //添加到数据库中 } |
运行一下看下是不是可以自动收集表单内容
(1)第一步还没有内容时,自然是显示页面了
(2)添加一下内容,数据库表中没有的数据,单击提交按钮
//先收集
$n
->Name =
"hhah"
;
//修改名字这个吧
$n
->add();
//再添加到数据库
看下运行效果:
先收集表单,单击提交按钮
五、修改数据库中表的数据(方法:save())
其实这个和添加差不多,也是有三种方法
这里也是在HomeController.class文件中继续编写修改方法
1
2
3
4
5
|
public function xiugai() {<br> $code = "n009" ; //修改数据当然是用到的主键值 $n = M( "nation" ); //因为要修改数据,所以要用到数据库,这里调用数据 //下面就是修改的方法 } |
(1)1.还是用if判断一下
1
2
3
4
5
6
7
|
if ( empty ( $_POST )) { $arrt = $n ->find( $code ); //利用find()方式读取一条数据,里面的参数自然就是主键 $this ->assign( "shuju" , $arrt ); //注入变量了,注意这里是$this不是别的 $this ->show(); //显示页面 } |
2.接下来就是做修改的模板页面了,名字就叫xiugai.html吧
1
2
3
4
5
6
|
<form action= "__ACTION__" method= "post" > <div>代号:<input type= "text" name= "Code" value= "{$shuju.code}" /></div> <!--显示的默认值就是上面的二维数组中的shuju--> <br /> <div>名称:<input type= "text" name= "Name" value= "{$shuju.name}" /></div> <input type= "submit" value= "修改" /> </form> |
看下结果
(2)这个就是修改的“否则”语句了
修改也是有三种方式
1.数组方式
1
2
|
//1.数组方式 $n ->save( $_POST ); //修改方法save() |
因为已经有了数组,所以直接调用就可以了
2.AR方式
1
2
3
4
|
//2.AR方式 $n ->Code = $_POST [ "Code" ]; $n ->Name = $_POST [ "Name" ]; $n ->save(); |
3.自动收集表单
1
2
3
|
//3.自动收集表单 $n ->create(); //自动收集表单数据 $n ->save(); |
3.1修改一下数据试试
3.2将上面的值修改为下图所示,然后单击“修改”按钮
3.3看下数据库是不是修改了,原来是hhah,修改为:维吾尔族
修改成功了~~
六、删除数据库表中的数据(方法:delete())
同样的继续写一个方法,这里就叫shanchu()吧
1
2
3
4
5
|
public function shanChu() { $n = M( "nation" ); $n -> delete ( "n008" ); //删除的是n008的数据,删除的方法:delete() } |
看下数据库这个n008的数据
执行一下这个方法,然后看下数据库中的数据
n008的这条数据已经被删除了
到现在对于数据库的修改数据就已经完事了,正常的增删改功能就这么些内容
需要记住:注意事项
添加修改都是三种方式,还是同样的方式(方法不同而已)
上面都是有关数据库的基本操作,查询,增删改操作,想要操作数据库,第一点就是要连接数据库!!
以上是关于PHP中的各种框架的主要内容,如果未能解决你的问题,请参考以下文章