首页 > 开发 > PHP > 正文

PHP的Yii框架中YiiBase入口类的扩展写法示例

2024-05-04 22:31:46
字体:
来源:转载
供稿:网友

通过yiic.php自动创建一个应用后,入口文件初始代码如下:

<?php// change the following paths if necessary$yii=dirname(__FILE__).'/../yii/framework/yii.php';$config=dirname(__FILE__).'/protected/config/main.php';// remove the following lines when in production modedefined('YII_DEBUG') or define('YII_DEBUG',true);// specify how many levels of call stack should be shown in each log messagedefined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3);require_once($yii);Yii::createWebApplication($config)->run();


其中第三行引入了一个yii.php的文件,这个可以在yii核心目录里的framework/下找到,这个文件中定义了一个Yii类,并且继承了YiiBase类。

代码如下

require(dirname(__FILE__).'/YiiBase.php'); /** * Yii is a helper class serving common framework functionalities. * * It encapsulates {@link YiiBase} which provides the actual implementation. * By writing your own Yii class, you can customize some functionalities of YiiBase. * * @author Qiang Xue <qiang.xue@gmail.com> * @package system * @since 1.0 */class Yii extends YiiBase{}

Yii::createWebApplication

这个方法实际上是在YiiBase父类中定义的,所以,Yii为我们预留了扩展的可能。我们只需要在yii.php中添加我们想要扩展的方法即可,在项目中直接使用 Yii::方法名() 调用。
为了将项目代码和核心目录完全分离,我个人觉得在项目目录下使用另外一个yii.php来替代从核心目录中包含yii.php更加好。

这里我用了更加极端的方法,我直接将yii这个类定义在了入口文件,并扩展了一个全局工厂函数 instance()方法,请看代码:

<?php// change the following paths if necessary$yii=dirname(__FILE__).'/../yii/framework/YiiBase.php';$config=dirname(__FILE__).'/protected/config/main.php';// remove the following lines when in production modedefined('YII_DEBUG') or define('YII_DEBUG',true);// specify how many levels of call stack should be shown in each log messagedefined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3);require_once($yii);//扩展基类class Yii extends YiiBase{  /**   * 全局扩展方法:工厂函数   * @param type $alias 类库别名   */  static function instance($alias){    static $_class_ = array();    $key = md5($alias);    if(!isset($_class_[$key])){      $_class_[$key] = self::createComponent($alias);    }    return $_class_[$key];  }}Yii::createWebApplication($config)->run();


这个类是在最后一行Yii::createWebApplication()之前定义的,以保证Yii类能正常使用(不要把这个类放在文件末尾,会出错。)

在项目中任何地方,使用$obj = Yii::instance($alias);去实例化一个类,并且是单例模式。

YiiBase中的两个比较重要的方法 (import,autoload)

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表