手把手编写PHP框架 深入了解MVC运行流程

来源:本网整理

框架思想就是提供一种可以在多个应用程序中使百用的设计。所有应用程序都有大量通用的基本内容—具体地说,就是某类与度数据库的接口、某些应用程序逻辑、应用程序呈现给用户的内容等。框架专门用于为这些常用问元素(数据库交互、表示层、应用程序逻辑)提供结构,以便您可以花费更少的时间来编写数据库接口代码或者表示层答接口,而花费更多的时间来编写应用程序本身。以这种方式分解应用程序,这种架构被称为模型-视图版-控制器(Model-View-Controller,MVC)。模型 指数据,视图 指表示层,而控制器 指应用程序权逻辑或业务逻辑。总体来说,框架就是别人写好的程序(封装了很多功能,可直接使用)www.zgxue.com防采集请勿采集本网。

s">

手把手编写PHP框架 深入了解MVC运行流程

作者:齐凯 字体:[增加 减小] 类型:转载 时间:2016-09-19 我要评论 手把手编写PHP框架,帮助大家深入了解MVC运行流程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 ">

1 什么是MVC 

php框架是指如zend framework这种开发框架,而不是如joomla,wordpress这种开源产品。如果你只是想了解开源产品可以随便找本书就行,而框架则不同。一般来说,需要程序员对php足够熟练才是开始接触框架的

MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。 

一般来讲学PHP还是要学写模板和框架的,这个是因为实际工作中的需要。一般框架都非常齐全,这样也可以让你对PHP有更深入的了解。学习了框架也可以提高工作效率。建议还是学习下,以后有些项目自己写的话也

PHP中MVC模式也称Web MVC,从上世纪70年代进化而来。MVC的目的是实现一种动态的程序设计,便于后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除 此之外,此模式通过对复杂度的简化,使程序结构更加直观。软件系统通过对自身基本部份分离的同时,也赋予了各个基本部分应有的功能。 

ORM是这类框架的总称,而不是具体的框架产品。缺点是需要一定的时间去学习如何使用,对于特殊性的应用需要深入了解框架内部的运行原理,而且此类框架的效率一般比手动编写的代码低。

MVC各部分的职能:

PHP不难学,难学的是一整套开发体系 Linux优化、数据库设计及优化、交互式界面编程、前端脚本(JS或AS)与php框架整合设计等等。这些都没有什么标准,需要你在工作中积累。建议你先看了解一下怎样

 •模型Model – 管理大部分的业务逻辑和所有的数据库逻辑。模型提供了连接和操作数据库的抽象层。

初学者啥框架都不需要学。只需要了解MVC就行。PHP大部分还是用的面向过程写的程序。MVC的话,建议学习thinkphp框架。qeephp也行。关键是基础要打好!

 •控制器Controller - 负责响应用户请求、准备数据,以及决定如何展示数据。

 •视图View – 负责渲染数据,通过HTML方式呈现给用户。 

一个典型的Web MVC流程:

 1.Controller截获用户发出的请求;

 2.Controller调用Model完成状态的读写操作;

 3.Controller把数据传递给View;

 4.View渲染最终结果并呈献给用户。 

2 为什么要自己开发MVC框架 

网络上有大量优秀的MVC框架可供使用,本教程并不是为了开发一个全面的、终极的MVC框架解决方案,而是将它看作是一个很好的从内部学习PHP的机会,在此过程中,你将学习面向对象编程和MVC设计模式,并学习到开发中的一些注意事项。 

更重要的是,你可以完全控制你的框架,并将你的想法融入到你开发的框架中。虽然不一定是做好的,但是你可以按照你的方式去开发功能和模块。 

3 开始开发自己的MVC框架 

3.1 目录准备 

在开始开发前,让我们先来把项目建立好,假设我们建立的项目为 todo,MVC的框架可以命名为 FastPHP,那么接下来的第一步就是把目录结构先设置好。

 

虽然在这个教程中不会使用到上面的所有的目录,但是为了以后程序的可拓展性,在一开始就把程序目录设置好使非常必要的。下面就具体说说每个目录的作用:

 •application – 应用代码

 •config – 程序配置或数据库配置

 •fastphp - 框架核心目录

 •public – 静态文件

 •runtime - 临时数据目录

 •scripts – 命令行工具 

3.2 代码规范

在目录设置好以后,我们接下来就要来规定一下代码的规范:

 1.MySQL的表名需小写,如:item,car

 2.模块名(Models)需首字母大写,并在名称后添加“Model”,如:ItemModel,CarModel

 3.控制器(Controllers)需首字母大写,并在名称中添加“Controller”,如:ItemController,CarController

 4.视图(Views)部署结构为“控制器名/行为名”,如:item/view.php,car/buy.php 

上述的一些规则是为了能在程序中更好的进行互相的调用。接下来就开始真正的PHP MVC编程了。 

3.3 重定向 

将所有的数据请求都重定向 index.php 文件,在 todo 目录下新建一个 .htaccess 文件,文件内容为: 

<IfModule mod_rewrite.c> RewriteEngine On # 确保请求路径不是一个文件名或目录 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 重定向所有请求到 index.php?url=PATHNAME RewriteRule ^(.*)$ index.php?url=$1 [PT,L]</IfModule>

这样做的主要原因有:

 1.程序有一个单一的入口;

 2.除静态程序,其他所有程序都重定向到 index.php 上;

 3.可以用来生成利于SEO的URL,想要更好的配置URL,后期可能会需要URL路由,这里先不做介绍了。 

3.4 入口文件 

做完上面的操作,就应该知道我们需要做什么了,没错!在 public 目录下添加 index.php 文件,文件内容为:

<?php// 应用目录为当前目录define('APP_PATH', __DIR__.'/');// 开启调试模式define('APP_DEBUG', true);// 网站根URLdefine('APP_URL', 'http://localhost/fastphp');// 加载框架require './fastphp/FastPHP.php';

注意,上面的PHP代码中,并没有添加PHP结束符号”?>”,这么做的主要原因是,对于只有 PHP 代码的文件,结束标志(“?>”)最好不存在,PHP自身并不需要结束符号,不添加结束符号可以很大程度上防止末尾被添加额外的注入内容,让程序更加安全。 

3.5 配置文件和主请求 

在 index.php 中,我们对 fastphp  文件夹下的 FastPHP.php 发起了请求,那么 FastPHP.php 这个启动文件中到底会包含哪些内容呢?

<?php// 初始化常量defined('FRAME_PATH') or define('FRAME_PATH', __DIR__.'/');defined('APP_PATH') or define('APP_PATH', dirname($_SERVER['SCRIPT_FILENAME']).'/');defined('APP_DEBUG') or define('APP_DEBUG', false);defined('CONFIG_PATH') or define('CONFIG_PATH', APP_PATH.'config/');defined('RUNTIME_PATH') or define('RUNTIME_PATH', APP_PATH.'runtime/');// 包含配置文件require APP_PATH . 'config/config.php';//包含核心框架类require FRAME_PATH . 'Core.php';// 实例化核心类$fast = new Core;$fast->run();

以上文件都其实可以直接在 index.php 文件中包含,常量也可以直接在 index.php 中定义,我们这么做的原因是为了在后期管理和拓展中更加的方便,所以把需要在一开始的时候就加载运行的程序统一放到一个单独的文件中引用。

先来看看config文件下的 config .php 文件,该文件的主要作用是设置一些程序的配置项及数据库连接等,主要内容为: 

<?php /** 变量配置 **/ define('DB_NAME', 'todo');define('DB_USER', 'root');define('DB_PASSWORD', 'root');define('DB_HOST', 'localhost');

应该说 config.php 涉及到的内容并不多,不过是一些基础数据库的设置,再来看看 fastphp下的共用框架入口文件 Core.php 应该怎么写。

 

<?php/** * FastPHP核心框架 */class Core{ // 运行程序 function run() { spl_autoload_register(array($this, 'loadClass')); $this->setReporting(); $this->removeMagicQuotes(); $this->unregisterGlobals(); $this->Route(); } // 路由处理 function Route() { $controllerName = 'Index'; $action = 'index'; if (!empty($_GET['url'])) { $url = $_GET['url']; $urlArray = explode('/', $url); // 获取控制器名 $controllerName = ucfirst($urlArray[0]); // 获取动作名 array_shift($urlArray); $action = empty($urlArray[0]) ? 'index' : $urlArray[0]; //获取URL参数 array_shift($urlArray); $queryString = empty($urlArray) ? array() : $urlArray; } // 数据为空的处理 $queryString = empty($queryString) ? array() : $queryString; // 实例化控制器 $controller = $controllerName . 'Controller'; $dispatch = new $controller($controllerName, $action); // 如果控制器存和动作存在,这调用并传入URL参数 if ((int)method_exists($controller, $action)) { call_user_func_array(array($dispatch, $action), $queryString); } else { exit($controller . "控制器不存在"); } } // 检测开发环境 function setReporting() { if (APP_DEBUG === true) { error_reporting(E_ALL); ini_set('display_errors','On'); } else { error_reporting(E_ALL); ini_set('display_errors','Off'); ini_set('log_errors', 'On'); ini_set('error_log', RUNTIME_PATH. 'logs/error.log'); } } // 删除敏感字符 function stripSlashesDeep($value) { $value = is_array($value) ? array_map('stripSlashesDeep', $value) : stripslashes($value); return $value; } // 检测敏感字符并删除 function removeMagicQuotes() { if ( get_magic_quotes_gpc()) { $_GET = stripSlashesDeep($_GET ); $_POST = stripSlashesDeep($_POST ); $_COOKIE = stripSlashesDeep($_COOKIE); $_SESSION = stripSlashesDeep($_SESSION); } } // 检测自定义全局变量(register globals)并移除 function unregisterGlobals() { if (ini_get('register_globals')) { $array = array('_SESSION', '_POST', '_GET', '_COOKIE', '_REQUEST', '_SERVER', '_ENV', '_FILES'); foreach ($array as $value) { foreach ($GLOBALS[$value] as $key => $var) { if ($var === $GLOBALS[$key]) { unset($GLOBALS[$key]); } } } } } // 自动加载控制器和模型类 static function loadClass($class) { $frameworks = FRAME_PATH . $class . '.class.php'; $controllers = APP_PATH . 'application/controllers/' . $class . '.class.php'; $models = APP_PATH . 'application/models/' . $class . '.class.php'; if (file_exists($frameworks)) { // 加载框架核心类 include $frameworks; } elseif (file_exists($controllers)) { // 加载应用控制器类 include $controllers; } elseif (file_exists($models)) { //加载应用模型类 include $models; } else { /* 错误代码 */ } }}

下面重点讲解主请求方法 callHook(),首先我们想看看我们的 URL 会这样:

yoursite.com/controllerName/actionName/queryString

callHook()的作用就是,从全局变量  G ET[ ′ url ′ ]变量中获取URL,并将其分割成三部分: GET[′url′]变量中获取URL,并将其分割成三部分:controller、action和 action和queryString。 

例如,URL链接为:todo.com/item/view/1/first-item,那么

 •$controller 就是:item

 •$action 就是:view

 •查询字符串Query String就是:array(1, first-item) 

分割完成后,会实例化一个新的控制器:$controller.'Controller'(其中“.”是连字符),并调用其方法 $action。 

3.6 控制器/Controller基类 

接下来的操作就是在 fastphp 中建立程序所需的基类,包括控制器、模型和视图的基类。 

新建控制器基类为 Controller.class.php,控制器的主要功能就是总调度,具体具体内容如下:

 

<?php /** * 控制器基类 */class Controller{ protected $_controller; protected $_action; protected $_view; // 构造函数,初始化属性,并实例化对应模型 function __construct($controller, $action) { $this->_controller = $controller; $this->_action = $action; $this->_view = new View($controller, $action); } // 分配变量 function assign($name, $value) { $this->_view->assign($name, $value); } // 渲染视图 function __destruct() { $this->_view->render(); }} 

Controller 类实现所有控制器、模型和视图(View类)的通信。在执行析构函数时,我们可以调用 render() 来显示视图(view)文件。

3.7 模型Model基类

新建模型基类为 Model.class.php,模型基类 Model.class.php 代码如下:

<?phpclass Model extends Sql{ protected $_model; protected $_table; function __construct() { // 连接数据库 $this->connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); // 获取模型名称 $this->_model = get_class($this); $this->_model = rtrim($this->_model, 'Model'); // 数据库表名与类名一致 $this->_table = strtolower($this->_model); } function __destruct() { }}

 考虑到模型需要对数据库进行处理,所以单独建立一个数据库基类 Sql.class.php,模型基类继承 Sql.class.php,代码如下:

<?phpclass Sql{ protected $_dbHandle; protected $_result; // 连接数据库 public function connect($host, $user, $pass, $dbname) { try { $dsn = sprintf("mysql:host=%s;dbname=%s;charset=utf8", $host, $dbname); $this->_dbHandle = new PDO($dsn, $user, $pass, array(PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC)); } catch (PDOException $e) { exit('错误: ' . $e->getMessage()); } } // 查询所有 public function selectAll() { $sql = sprintf("select * from `%s`", $this->_table); $sth = $this->_dbHandle->prepare($sql); $sth->execute(); return $sth->fetchAll(); } // 根据条件 (id) 查询 public function select($id) { $sql = sprintf("select * from `%s` where `id` = '%s'", $this->_table, $id); $sth = $this->_dbHandle->prepare($sql); $sth->execute(); return $sth->fetch(); } // 根据条件 (id) 删除 public function delete($id) { $sql = sprintf("delete from `%s` where `id` = '%s'", $this->_table, $id); $sth = $this->_dbHandle->prepare($sql); $sth->execute(); return $sth->rowCount(); } // 自定义SQL查询,返回影响的行数 public function query($sql) { $sth = $this->_dbHandle->prepare($sql); $sth->execute(); return $sth->rowCount(); } // 新增数据 public function add($data) { $sql = sprintf("insert into `%s` %s", $this->_table, $this->formatInsert($data)); return $this->query($sql); } // 修改数据 public function update($id, $data) { $sql = sprintf("update `%s` set %s where `id` = '%s'", $this->_table, $this->formatUpdate($data), $id); return $this->query($sql); } // 将数组转换成插入格式的sql语句 private function formatInsert($data) { $fields = array(); $values = array(); foreach ($data as $key => $value) { $fields[] = sprintf("`%s`", $key); $values[] = sprintf("'%s'", $value); } $field = implode(',', $fields); $value = implode(',', $values); return sprintf("(%s) values (%s)", $field, $value); } // 将数组转换成更新格式的sql语句 private function formatUpdate($data) { $fields = array(); foreach ($data as $key => $value) { $fields[] = sprintf("`%s` = '%s'", $key, $value); } return implode(',', $fields); }}

应该说,Sql.class.php 是框架的核心部分。为什么?因为通过它,我们创建了一个 SQL 抽象层,可以大大减少了数据库的编程工作。虽然 PDO 接口本来已经很简洁,但是抽象之后框架的可灵活性更高。 

3.8 视图View类 

视图类 View.class.php 内容如下:

<?php/** * 视图基类 */class View{ protected $variables = array(); protected $_controller; protected $_action; function __construct($controller, $action) { $this->_controller = $controller; $this->_action = $action; } /** 分配变量 **/ function assign($name, $value) { $this->variables[$name] = $value; } /** 渲染显示 **/ function render() { extract($this->variables); $defaultHeader = APP_PATH . 'application/views/header.php'; $defaultFooter = APP_PATH . 'application/views/footer.php'; $controllerHeader = APP_PATH . 'application/views/' . $this->_controller . '/header.php'; $controllerFooter = APP_PATH . 'application/views/' . $this->_controller . '/footer.php'; // 页头文件 if (file_exists($controllerHeader)) { include ($controllerHeader); } else { include ($defaultHeader); } // 页内容文件 include (APP_PATH . 'application/views/' . $this->_controller . '/' . $this->_action . '.php'); // 页脚文件 if (file_exists($controllerFooter)) { include ($controllerFooter); } else { include ($defaultFooter); } }} 

这样我们的核心的PHP MVC框架就编写完成了,下面我们开始编写应用来测试框架功能。

4 应用

4.1 数据库部署

在 SQL 中新建一个 todo 数据库,使用下面的语句增加 item 数据表并插入2条记录:

CREATE DATABASE `todo` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;USE `todo`;CREATE TABLE `item` ( `id` int(11) NOT NULL auto_increment, `item_name` varchar(255) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; INSERT INTO `item` VALUES(1, 'Hello World.');INSERT INTO `item` VALUES(2, 'Lets go!');

4.2 部署模型 

然后,我们还需要在 models 目录中创建一个 ItemModel.php 模型,内容如下:

<?phpclass ItemModel extends Model{ /* 业务逻辑层实现 */}

模型内容为空。因为 Item 模型继承了 Model,所以它拥有 Model 的所有功能。

4.3 部署控制器 

在 controllers 目录下创建一个 ItemController.php 控制器,内容如下:

<?php class ItemController extends Controller{ // 首页方法,测试框架自定义DB查询 public function index() { $items = (new ItemModel)->selectAll(); $this->assign('title', '全部条目'); $this->assign('items', $items); } // 添加记录,测试框架DB记录创建(Create) public function add() { $data['item_name'] = $_POST['value']; $count = (new ItemModel)->add($data); $this->assign('title', '添加成功'); $this->assign('count', $count); } // 查看记录,测试框架DB记录读取(Read) public function view($id = null) { $item = (new ItemModel)->select($id); $this->assign('title', '正在查看' . $item['item_name']); $this->assign('item', $item); } // 更新记录,测试框架DB记录更新(Update) public function update() { $data = array('id' => $_POST['id'], 'item_name' => $_POST['value']); $count = (new ItemModel)->update($data['id'], $data); $this->assign('title', '修改成功'); $this->assign('count', $count); } // 删除记录,测试框架DB记录删除(Delete) public function delete($id = null) { $count = (new ItemModel)->delete($id); $this->assign('title', '删除成功'); $this->assign('count', $count); }}

4.4 部署视图 

在 views 目录下新建 header.php 和 footer.php 两个页头页脚模板,内容如下。 

header.php,内容:

<html><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title><?php echo $title ?></title> <style> .item { width:400px; } input { color:#222222; font-family:georgia,times; font-size:24px; font-weight:normal; line-height:1.2em; color:black; } a { color:blue; font-family:georgia,times; font-size:20px; font-weight:normal; line-height:1.2em; text-decoration:none; } a:hover { text-decoration:underline; } h1 { color:#000000; font-size:41px; letter-spacing:-2px; line-height:1em; font-family:helvetica,arial,sans-serif; border-bottom:1px dotted #cccccc; } h2 { color:#000000; font-size:34px; letter-spacing:-2px; line-height:1em; font-family:helvetica,arial,sans-serif; } </style></head><body> <h1><?php echo $title ?></h1> footer.php,内容: </body></html>

然后,在 views/item 创建以下几个视图文件。 

index.php,浏览数据库内 item 表的所有记录,内容:

<form action="<?php echo APP_URL ?>/item/add" method="post"> <input type="text" value="点击添加" onclick="this.value=''" name="value"> <input type="submit" value="添加"></form><br/><br/><?php $number = 0?> <?php foreach ($items as $item): ?> <a class="big" href="<?php echo APP_URL ?>/item/view/<?php echo $item['id'] ?>" title="点击修改"> <span class="item"> <?php echo ++$number ?> <?php echo $item['item_name'] ?> </span> </a> ---- <a class="big" href="<?php echo APP_URL ?>/item/delete/<?php echo $item['id']?>">删除</a><br/><?php endforeach ?>

add.php,添加记录,内容:

 <a class="big" href="<?php echo APP_URL ?>/item/index">成功添加<?php echo $count ?>条记录,点击返回</a> 

view.php,查看单条记录,内容:

<form action="<?php echo APP_URL ?>/item/update" method="post"> <input type="text" name="value" value="<?php echo $item['item_name'] ?>"> <input type="hidden" name="id" value="<?php echo $item['id'] ?>"> <input type="submit" value="修改"></form><a class="big" href="<?php echo APP_URL ?>/item/index">返回</a>

update.php,更改记录,内容:

 <a class="big" href="<?php echo APP_URL ?>/item/index">成功修改<?php echo $count ?>项,点击返回</a> 

delete.php,删除记录,内容:

 <a href="<?php echo APP_URL ?>/item/index">成功删除<?php echo $count ?>项,点击返回</a> 

4.5 应用测试 

这样,在浏览器中访问 todo 程序:http://localhost/todo/item/index/,就可以看到效果了。 

以上代码已经全部发布到 github 上,关键部分加航了注释,仓库地址:https://github.com/yeszao/fastphp,欢迎克隆、提交。

要设计更好的MVC,或使用得更加规范,请看《MVC架构的职责划分原则》 。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持突袭网。

我就说说我见过的框架吧,smarty,thinkphp,zend framework,yii framework 我刚学习的是smarty,这个比较容易,适合新手,不过机制没有其他的好,thinkphp 用的人很多,学习起来不是很难,新手也可以学习,zend famework 这个没有接触据说比前两个难,而yii 的话可以做大中型网站绝对没问题,也比较轻量级,如果你的要求比较高可以直接学习这个,下面是别人的意见,我也复制过来让你看下:1.YiiYii是一个基于组件的高性能的PHP的框架,用于开发大规模Web应用。Yii采用严格的OOP编写,并有着完善的库引用以及全面的教程。从MVC,DAO/ActiveRecord,widgets,caching,等级式RBAC,Web服务,到主体化,I18N和L10N,Yii提供了今日Web 2.0应用开发所需要的几乎一切功能。而且这个框架的价格也并不太高。事实上,Yii是最有效率的PHP框架之一。2.CodeIgniterCodeIgniter是一个应用开发框架—一个为建立PHP网站的人们所设计的工具包。其目标在于快速的开发项目:它提供了丰富的库组以完成常见的任务,以及简单的界面,富有条理性的架构来访问这些库。使用CodeIgniter开发可以往项目中注入更多的创造力,因为它节省了大量编码的时间。3.CakePHPCakePHP是一个快速开发PHP的框架,其中使用了一些常见的设计模式如ActiveRecord,Association Data Mapping,Front Controller以及MVC。其主要目标在于提供一个令任意水平的PHP开发人员都能够快速开发web应用的框架,而且这个快速的实现并没有牺牲项目的弹性。4.PHPDevShellPHPDevShell是一个开源(GNU/LGPL)的快速应用开发框架,用于开发不含Javascript的纯PHP。它有一个完整的GUI管理员后台界面。其主要目标在于开发插件一类的基于管理的应用,其中速度、安全、稳定性及弹性是最优先考虑的重点。其设计形成了一个简单的学习曲线,PHP开发者无需学习复杂的新术语。PHPDevShell的到来满足了开发者们对于一个轻量级但是功能完善,可以无限制的进行配置的GUI的需求。5.AkelosAkelos PHP框架是一个基于MVC设计模式的web应用开发平台。基于良好的使用习惯,使用它可以完成如下任务:方便的使用Ajax编写views通过控制器管理请求(request)及响应(response)管理国际化的应用使用简单的协议与模型及数据库通信你的Akelos应用可以在大多数共享主机服务供应方上运行,因为Akelos对服务器唯一的要求就是支持PHP。因此,Akelos PHP框架是理想的用于发布单独web应用的框架,因为它不需要非标准PHP配置便能运行。6.SymfonySymfony是一个用于开发PHP5项目的web应用框架。这个框架的目的在于加速web应用的开发以及维护,减少重复的编码工作。Symfony的系统需求不高,可以被轻易的安装在任意设置上:你只需一个Unix或Windows,搭配一个安装了PHP5的网络服务器即可。它与差不多所有的数据库兼容。Symfony的价位不高,相比主机上的花销要低得多。对于PHP开发者而言,使用Symfony是一件很自然的事,其学习曲线只有短短一天。干净的设计以及代码可读性将缩短开发时间。开发者可以将敏捷开发的原理(如DRY,KISS或XP等)应用在其中,将重点放在应用逻辑层面上,而不用花费大量时间在编写没完没了的XML配置文件上。Symfony旨在建立企业级的完善应用程序。也就是说,你拥有整个设置的控制权:从路径结构到外部库,几乎一切都可以自定义。为了符合企业的开发条例,Symfony还绑定了一些额外的工具,以便于项目的测试,调试以及归档。7.PradoPRADO团队由一些PRADO狂热者组成,这些成员开发并推动PRADO框架以及相关项目的进行。PRADO的灵感起源于Apache Tapestry。从04年开始,PRADO成为SourceForge上的开源项目之一。这个项目目前进展到了3.x版本。8.Zend作为PHP艺术及精神的延伸,Zend框架的基础在于简单,面向对象的最佳方法,方便企业的许可协议,以及经过反复测试的快速代码库。Zend框架旨在建造更安全,更可靠的Web 2.0应用及web服务,并不断从前沿厂商(如Google,Amazon,Yahoo,Flickr,StrikeIron和ProgrammableWeb等)的API那里吸收精华。9.ZooPZoop PHP框架,意为Zoop面向对象的PHP框架。这是个稳定,可伸缩并可移植的框架。从诞生到现在的5年间,已经在不少产品开发中被使用。Zoop是一个快速,有效并干净的框架。它的伸缩性很好,你可以只安装你需要的功能。对代码并不很熟悉的开发者也可以通过Zoop快速的开发安全的web应用。熟练的开发者则可以更加将Zoop的弹性利用到极致。Zoop建议将display,logic以及数据层(MVC)分开使用。Zoop由很多组件和项目集合而成,其中包括smarty和prototype AJAX框架,PEAR模块等。高效的核心组件提供了很多你原本需要自己编码来实现的功能。Zoop内置的纠错功能可以通过配置实现生产环境下的错误日志生成,这个错误日志提供了很多信息,可读性很高,可以更轻易的寻找并排除错误。Zoop的一个特别之处在于其GuiControls,在PHP中是一个相当革新的想法。它提供了很多form widgets与验证完整的集合到一起,并形成了一个可以轻松打造个性化GuiControls的框架。10.QPHPQPHP,意为快速PHP,它是一个与ASP.NET类似的MVC框架。基本上它是这样一个情况:整合了Java和C#的美感除去了在其他PHP框架中使用的Perl形式的意义含糊的语言大量基于OOP的概念内容来自www.zgxue.com请勿采集。

免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
Copyright © 2017 www.zgxue.com All Rights Reserved