php框架编写思路要点
一、单入口文件,一般为index.php, 一般做3件事:
1》在这个文件里一般不提供任何处理代码,只是可以预定义一些配置中的变量,覆盖框架中的配置
2》加载框架,创建应用
3》运行应用
二、加载框架的文件,要干的事:
1》定义开始时间常量 及 内存初始使用情况:YII_BEGIN_TIME MEMORY_LIMIT_ON
2》定义调试状态:YII_DEBUG
3》定义调试时显示的错误跟踪栈:YII_TRACE_LEVEL
4》定义是否能处理异常和错误:YII_ENABLE_EXCEPTION_HANDLER YII_ENABLE_ERROR_HANDLER
5》定义框架路径:YII_PATH
6》定义其他一些用到的常量
----------------------------------------
7》定义生成应用的类,在这个类中要干的事:
1:定义存储预加载的类映射$classMap = array(‘类名' => '类路径')
2:定义应用中用到的一些共有方法,如日志处理,性能分析,注册自动加载机制
三、框架目录机构规划
1》框架入口文件,如iWeb.php,提供创建应用,注册自动加载机制等
2》各功能模块单独存放在目录里:一般包括数据库处理DB,缓存处理Cache,语言处理Lang,日志处理Log, 国际化处理util,处理网站应用的Web(包括action,controller,model,view
四、对于一些重要的配置参数,在应用CApplication类中应该提供对其调用的接口函数
注意:虽然通过config.php可以直接通过键名获取,但是这样的话无法确保是否配置正确,单独写函数可以判断是否写的正确)如Yii中的CApplication设置 (private $_basePath;) 这个属性的方法(虽然在config配置中'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..')已经配置过了,但是提供接口可以确保是个有效的地址。
/** * Returns the root path of the application. * @return string the root directory of the application. Defaults to 'protected'. */ public function getBasePath() { return $this ->_basePath; } /** * Sets the root directory of the application. * This method can only be invoked at the begin of the constructor. * @param string $path the root directory of the application. * @throws CException if the directory does not exist. */ public function setBasePath( $path ) {<br> //如果文件存在且是一个路径 if (( $this ->_basePath= realpath ( $path ))===false || ! is_dir ( $this ->_basePath)) throw new CException(Yii::t( 'yii' , 'Application base path "{path}" is not a valid directory.' , array ( '{path}' => $path ))); } |
三、使用一个常量或路径别名来代替长的路径配置
Yii中运用的: Yii::setPathOfAlias( 'application' , $this ->getBasePath()); Yii::setPathOfAlias( 'webroot' ,dirname( $_SERVER [ 'SCRIPT_FILENAME' ])); Yii::setPathOfAlias( 'ext' , $this ->getBasePath().DIRECTORY_SEPARATOR. 'extensions' );phpcms中运用的: //PHPCMS框架路径define('PC_PATH',dirname(__FILE__).DIRECTORY_SEPARATOR);if(!defined('PHPCMS_PATH'))define('PHPCMS_PATH', PC_PATH.'..'.DIRECTORY_SEPARATOR);//缓存文件夹地址define('CACHE_PATH', PHPCMS_PATH.'caches'.DIRECTORY_SEPARATOR);//主机协议define('SITE_PROTOCOL',isset($_SERVER['SERVER_PORT']) &&$_SERVER['SERVER_PORT'] =='443' ? 'https://':'http://');//当前访问的主机名define('SITE_URL', (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] :''));//来源define('HTTP_REFERER',isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] :'') |
四、处理前添加钩子处理
来自Yii中CApplication中的都__construct方法 $this ->preinit(); //处理请求前添加钩子,预处理$this->initSystemHandlers(); //预初始化一些事,如错误处理,exception处理$this->registerCoreComponents();$this->configure($config);$this->attachBehaviors($this->behaviors);$this->preloadComponents();$this->init(); //处理请求后添加初始化方法/** * Initializes the class autoloader and error handlers. */protected function initSystemHandlers(){ if(YII_ENABLE_EXCEPTION_HANDLER) set_exception_handler(array($this,'handleException')); if(YII_ENABLE_ERROR_HANDLER) set_error_handler(array($this,'handleError'),error_reporting());} |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义