PHP的Yii框架中YiiBase入口类的扩展写法示例
通过yiic.php自动创建一个应用后,入口文件初始代码如下: run();
其中第三行引入了一个yii.php的文件,这个可以在yii核心目录里的framework/下找到,这个文件中定义了一个Yii类,并且继承了YiiBase类。 代码如下 /**
而 这个方法实际上是在YiiBase父类中定义的,所以,Yii为我们预留了扩展的可能。我们只需要在yii.php中添加我们想要扩展的方法即可,在项目中直接使用 Yii::方法名() 调用。 为了将项目代码和核心目录完全分离,我个人觉得在项目目录下使用另外一个yii.php来替代从核心目录中包含yii.php更加好。 这里我用了更加极端的方法,我直接将yii这个类定义在了入口文件,并扩展了一个全局工厂函数 instance()方法,请看代码: run();
这个类是在最后一行Yii::createWebApplication()之前定义的,以保证Yii类能正常使用(不要把这个类放在文件末尾,会出错。) 在项目中任何地方,使用$obj = Yii::instance($alias);去实例化一个类,并且是单例模式。 YiiBase中的两个比较重要的方法 (import,autoload)然后看看YiiBase中的import方法就知道这些静态变量是干嘛用的了: realpath(__DIR__ . '/../vendor/cornernote/yii-email-module/email')
if (($path = self::getPathOfAlias($namespace)) !== false) {
$classFile = $path . DIRECTORY_SEPARATOR . substr($alias,$pos + 1) . '.php';
if ($forceInclude) {
if (is_file($classFile)) {
require($classFile);
} else {
throw new CException(Yii::t('yii','Alias "{alias}" is invalid. Make sure it points to an existing PHP file and the file is readable.',array('{alias}' => $alias)));
}
self::$_imports[$alias] = $alias;
} else {
self::$classMap[$alias] = $classFile;
}
return $alias;
} else {
// try to autoload the class with an autoloader
if (class_exists($alias,true)) {
return self::$_imports[$alias] = $alias;
} else {
throw new CException(Yii::t('yii','Alias "{alias}" is invalid. Make sure it points to an existing directory or file.',array('{alias}' => $namespace)));
}
}
}
if (($pos = strrpos($alias,'.')) === false) // a simple class name
{
// try to autoload the class with an autoloader if $forceInclude is true
if ($forceInclude && (Yii::autoload($alias,true) || class_exists($alias,true))) {
self::$_imports[$alias] = $alias;
}
return $alias;
}
$className = (string)substr($alias,$pos + 1);
$isClass = $className !== ''; 是的,上面这个方法最后就把要加载的东西都放到$_imports,$_includePaths中去了。这就是Yii的import方法,好的,接下来我们看看autoload方法: $className,'{file}' => $classFile,)));
}
break;
}
}
} else {
include($className . '.php');
}
} else // class name with namespace in PHP 5.3
{
$namespace = str_replace('',ltrim($className,''));
if (($path = self::getPathOfAlias($namespace)) !== false) {
include($path . '.php');
} else {
return false;
}
}
return class_exists($className,false); } return true;} config文件中的 import 项里的类或路径在脚本启动中会被自动导入。用户应用里个别类需要引入的类可以在类定义前加入 Yii::import() 语句。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |