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)
{
//如果文件存在且是一个路径 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());
}

原文地址:https://www.cnblogs.com/Alight/p/3110442.html