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());}

 

posted @   一束光  阅读(556)  评论(0编辑  收藏  举报
编辑推荐:
· .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 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义

友情链接

CFC4N
点击右上角即可分享
微信分享提示