说到PHP单入口模式,很快想到关于PHP的一些框架,zend,thinkphp,qeephp,还有cakephp 等,它们都采用了统一的入口,可以根据不同的需要,分前台入口后台入口或者其他操作权限入口,这样的设计模式优点很明显,比如。权限控制,url重写,结合MVC清晰地目录结构。这些都是单入口模式所带来的便利,当然这样的也会带来执行效率的疑问。
由单入口模式,我顺便提下单件模式,结合OO特性。
<?php
class A{
private static $tag = null;
private function __construct(){}
static function getObject(){
if( null == self::$tag){
self::$tag = new A();
}
return self::$tag;
}
}
$object1 = A::getObject();
$object2 = A::getObject();
if($object1 === $object2){
echo "同一对象";
}else{
echo "不同对象";
}
通过$tag标示class是否实例化,$tag为空,则实例化当前类并赋给$tag,如果不为空则返回这个指向实例的static 属性。
继续知识延伸...工厂模式
工厂模式是由一个工厂类根据传入的参量决定创建出哪一种产品类的实例。工厂模式在小项目不很实用。不过这种编码形式是非常值得去学习和使用,而且有利于应用于任意规模的项目中。结合MVC结构,可以联想到当前的一些框架结构。
下面是‘逍遥冰心’写关于5个框架的比较,有些内容还是比较客观的。
http://www.demonitech.com/index.php/archives/100
单入口模式(以thinkphp为例)
<?php
// 定义ThinkPHP框架路径
define('THINK_PATH', './ThinkPHP/');
//定义项目名称和路径
define('APP_NAME', 'Myapp');
define('APP_PATH', '.');
// 加载框架入口文件
require(THINK_PATH."/ThinkPHP.php");
//实例化一个网站应用实例
App::run();
thinkphp对单一入口的解释
“单一入口通常是指一个项目或者应用具有一个统一(但并不一定是唯一)的入口文件,也就是说项目的所有功能操作都是通过这个入口文件进行的,并且往往入口文件是第一步被执行的。
单一入口的好处是项目整体比较规范,因为同一个入口,往往其不同操作之间具有相同的规则。另外一个方面就是单一入口带来的好处是控制较为灵活,因为拦截方便了,类似如一些权限控制、用户登录方面的判断和操作可以统一处理了。
或者有些人会担心所有网站都通过一个入口文件进行访问,是否会造成太大的压力,其实这是杞人忧天的想法。”
让我看看thinkphp结构
流程:
thinkphp.php下,
<?php
$GLOBALS['_beginTime'] = microtime(TRUE);
if(!defined('APP_PATH')) define('APP_PATH', dirname($_SERVER['SCRIPT_FILENAME']));
if(!defined('RUNTIME_PATH')) define('RUNTIME_PATH',APP_PATH.'/Runtime/');
if(defined('RUNTIME_ALLINONE') && is_file(RUNTIME_PATH.'~allinone.php')) {
// ALLINONE 模式直接载入allinone缓存
$result = require RUNTIME_PATH.'~allinone.php';
C($result);
// 自动设置为运行模式
define('RUNTIME_MODEL',true);
}else{
if(version_compare(PHP_VERSION,'5.0.0','<')) die('require PHP > 5.0 !');
// ThinkPHP系统目录定义
if(!defined('THINK_PATH')) define('THINK_PATH', dirname(__FILE__));
if(!defined('APP_NAME')) define('APP_NAME', basename(dirname($_SERVER['SCRIPT_FILENAME'])));
if(is_file(RUNTIME_PATH.'~runtime.php')) {
// 加载框架核心编译缓存
require RUNTIME_PATH.'~runtime.php';
}else{
// 加载编译函数文件
require THINK_PATH."/Common/runtime.php";
// 生成核心编译~runtime缓存
build_runtime();
}
}
// 记录加载文件时间
$GLOBALS['_loadTime'] = microtime(TRUE);
?>
检查THINK_PATH、 APP_NAME、 APP_PATH、 RUNTIME_PATH 定义
加载系统定义文件 编译缓存目录 加载系统核心类库 根据PHP的版本加载兼容函数库 生成核心编译缓存~runtime.php,至于后面太多细碎的工作。然后build项目配置文件,公共文件。。然后到后面的app,中间Dispatcher,GetModule还有很多我都跳过了,
最后又回到入口。
总结:
这些跟据最近看的东西然后把一些有联系没联系的都添加进去,整体上把单件模式,工厂模式,单入口模式 笼统的概括了下,还需要更深入的去理解,根据thinkphp了解下一个框架的一些基本的操作流程,结合MVC,我觉得thinkphp较之zend还是不够强大。但是适合我们这些菜鸟学习。