php实现的单一入口应用程序实例分析
《:php实现的单一入口应用程序实例分析》要点: PHP教程本文较为详细的分析了php单一入口应用程序.分享给大家供大家参考.具体如下: PHP教程什么是单一入口应用程序? PHP教程在解释什么是单一入口应用程序之前,我们先来看看传统的 web 应用程序. PHP教程那什么是入口啊? PHP教程打个比方,大家上 WC,都是男生进一个门,女生进一个门.这两个门就是 WC 的两个入口. PHP教程呵呵,上面的例子应该很好理解吧.那稍微变换一下,单一入口的概念就很容易理解了. PHP教程所以单一入口的应用程序实际上就是说用一个文件处理所有的 HTTP 哀求.例如不管是新闻列表功能还是新闻编辑功能,都是从浏览器访问 index.php 文件.这个 index.php 文件就是这个应用程序的单一入口. PHP教程index.php 如何知道用户是要使用哪一个功能呢? PHP教程很简单,我们拜访 index.php 时跟上一个特定的参数就行了.例如 index.php?action=news 就是显示新闻列表,而 index.php?action=news_edit 就是新闻编辑. PHP教程而在 index.php 里面,仅用两行代码就可以实现这种效果. PHP教程
<?php
$action = $_GET['action'] == '' ? 'index' : $_GET['action'];
include('files/' . $action . '.php');
?>
PHP教程上面的代码中,第一行是从 url 中取出 action 参数.如果没有提供 action 参数,就设置一个默认的 'index' 作为参数. PHP教程单一入口应用程序的入口文件很复杂? PHP教程有些朋友可能以为单一入口程序的 index.php 会像面条一样复杂,其实是误解. PHP教程
<?php
define('APP',realpath('../libs/website'));
define('LANG','gb2312');
define('DEBUG',1);
require('../libs/flea1/basic.php');
run();
?>
PHP教程足够简单了吧? PHP教程当然了,在 index.php 里面写上一长串 switch case 绝对是拙劣的实现方式.但这纯粹是开发者自己的设计和实现问题,而不是单一入口应用程序这种设计思想的问题. PHP教程补充说明: 这里提到 switch case 并不是说用了 switch 就代表“落后”、“土气”等.只是说在 index.php 这个入口程序里面写上一堆 switch case 不利于程序的修改和维护,所以是一种不好的用法. PHP教程单一入口应用程序的设计思想 PHP教程当web服务器(apache或者iis)收到一个http哀求时,会解析该哀求,确定要访问哪一个文件.例如 http://www.xxx.com/news.php 的解析结果就是要求web服务器解析 news.php 文件,并返回结果给浏览器.现在看看单一入口应用程序的 index.php 文件,就会发现 index.php 实际上根据 url 参数进行了第二次解析. PHP教程完成这个解析的程序一般称为 Dispatcher(中文的准确翻译我也不知道),大概意思就是将不同的哀求转发到不同的处理程序进行处理. PHP教程在单一入口应用程序中,index.php 和 web服务器一起构成了一个 Dispatcher,根据 http 哀求和 url 参数来确定哀求的处理程序. PHP教程了解了 Dispatcher 的概念后,我们可以发现前面提到的两行代码实际上就是一个最简单的 Dispatcher 实现: PHP教程
<?php
$action = $_GET['action'] == '' ? 'index' : $_GET['action'];
include('files/' . $action . '.php');
?>
PHP教程诚然,对于一个平安、健壮的应用程序,Dispatcher 肯定不是上面那么简单.在调用实际代码前,还会加上各种判断、平安性检查等.例如判断 url 指定的功能是否可以访问以及 url 中包含了无效的参数. PHP教程看到这里,朋友们肯定会说:单一入口程序就多了就这样一个 dispatcher,和我直接做成 news.php、news_edit.php 等单个文件相比有什么好处啊? PHP教程单一入口应用程序的优势 PHP教程单一入口应用程序的所有http哀求都是通过 index.php 接收并转发到功能代码去的,所以我们在 index.php 里面就能完成许多实际工作. PHP教程这里我只拿平安性检查为例详细说明一下: PHP教程由于所有的 http 哀求都由 index.php 接收,所以可以进行集中的安全性检查.如果不是单一入口,那么开发者就必须记得在每一个文件的开始加上安全性检查代码(当然,安全性检查代码可以写到另一个文件中,只需要include进来就可以了). PHP教程与平安性检查类似.在入口里,我们还可以对url参数和post进行必要的检查和特殊字符过滤、记录日志、访问统计等等各种可以集中处理的任务. PHP教程“咦,搞这么多功能,不是会把 index.php 搞得很复杂吗?” PHP教程可以看出,由于这些工作都被集中到了 index.php 来完成,可以减轻我们维护其他功能代码的难度.例如在10个文件中保持头部的几个include都一致可不是件让人愉快的事情. PHP教程单一入口应用程序的缺点 PHP教程任何事情都有两面性,单一入口应用程序也不例外.由于所有 http 哀求都是针对 index.php,所以应用程序的 url 看起来确实不那么美观.特别是对搜索引擎来说很不友好. PHP教程要解决这个问题,可以采用 url 重写、PATHINFO 等方式.但我个人更推荐在前台页面不使用单一入口方式,而是保持多个文件入口.或者两者混用.例如新闻列表采用单独的 news.php 显示,而用户注册、颁发信息等则采用单一入口.因为对于网站拥有者来说,新闻列表、新闻显示页面才是需要搜索引擎关注的高价值目标,而用户注册页面等交互性功能则根本没有收录的价值. PHP教程有朋友提到单一入口的应用程序会有很长一串参数,那么我们分析一下下面这个 url: PHP教程所以认为单一入口的应用程序 url 太复杂是没有道理的. PHP教程如何组织单一入口应用程序的功能代码? PHP教程单一入口应用程序最大的挑战来自于如何合理组织各个功能的处理代码.但只要遵循一定的步骤,也可以轻松的办理掉这个难题. PHP教程首先,对于应用程序的功能要做出一个合理的分解.例如后台的新闻栏目可能包含“添加新闻”、“编辑新闻”、“删除新闻”等多个功能.这时我们就可以将这一组逻辑上关联的功能组合到一个功能模块中,称为“新闻管理”模块. PHP教程整理完功能后,我们就需要确定如何存放各个功能的代码.这里我推荐两种方式: PHP教程1、每个功能模块一个子目录,目录里的每一个文件就是一个功能的实现代码. PHP教程2、每个模块一个文件,模块中的每个功能写成一个函数或者一个类办法. PHP教程好了,我们的功能代码都确定存放方式了.那么如何调用呢? PHP教程index.php 如何调用功能代码? PHP教程调用首先就是要设计一个规则,然后让 index.php 根据这个规则来搜索和调用功能代码.就我自己来说,我总是使用 $_GET['url'] 来指定要调用的功能模块,而 $_GET['action'] 来指定该模块的特定功能.因此我的应用程序会使用如下的 url 地址: PHP教程觉得两个参数太多了?那可以使用 index.php?func=news.edit 这样的 url.只需要将 news.edit 拆开为 news 和 edit 就行了. PHP教程“嘿嘿,那我故意搞一个 index.php?url=news&action=xxx,看你的应用程序还能运行?” PHP教程相反,我还可以让 index.php 在发现找不到需要的功能代码时显示一个漂亮的出错页面,并提供一个返回网站首页的连接. PHP教程在实际开发中,我倾向于将一些基本服务从应用程序中抽取出来,形成一个应用程序框架.这个框架通常会包含一个 Dispatcher、基本的数据库拜访服务、模版引擎、常用的辅助功能等.由于有了一个框架,所以我可以更加让 Dispatcher 更加灵活.例如可以对某些功能模块应用权限检查,而另一些则不检查. PHP教程进一步了解单一入口应用程序 PHP教程要深刻理解一个事物,自己尝试一下是最好的方法. PHP教程你可以选择自己实现一个 Dispatcher 以及相应的各种规则,或者选择一个现有的应用程序框架.但更好的方式还是首先尝试一下现有的框架,然后再自己尝试实现一个类似的.这样可以在最短的时间内获得最多的收获. PHP教程目前绝大多数 php 应用程序框架都是单一入口的,并采用了 MVC 模式(很遗憾,由于 MVC 实在太复杂,并且和单一入口应用程序也没有必然联系,所以我就不赘述了.感兴趣的朋友可以 google 一下相关资料). PHP教程我个人推荐下面的框架: PHP教程FleaPHP PHP教程CakePHP PHP教程symfony PHP教程其他 PHP教程希望本文所述对大家的php程序设计有所赞助. 欢迎参与《:php实现的单一入口应用程序实例分析》讨论,分享您的想法,编程之家 52php.cn为您提供专业教程。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |