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

前端之家收集整理的这篇文章主要介绍了PHP的Yii框架中YiiBase入口类的扩展写法示例前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

PHP;"> run();

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

代码如下

PHP;"> 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
    {
    }

PHP;"> Yii::createWebApplication

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

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

PHP;"> 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 !== '';
if ($isClass && (class_exists($className,false) || interface_exists($className,false))) {
return self::$_imports[$alias] = $className;
}
if (($path = self::getPathOfAlias($alias)) !== false) {
if ($isClass) {
if ($forceInclude) {
if (is_file($path . '.PHP')) {
require($path . '.PHP');
} else {
throw new CException(Yii::t('yii',array('{alias}' => $alias)));
}
self::$_imports[$alias] = $className;
} else {
self::$classMap[$className] = $path . '.PHP';
}
return $className;
}
// $alias是'system.web.
'这样的已*结尾的路径,将路径加到include_path中
else // a directory
{
if (self::$_includePaths === null) {
self::$_includePaths = array_unique(explode(PATH_SEPARATOR,get_include_path()));
if (($pos = array_search('.',self::$_includePaths,true)) !== false) {
unset(self::$_includePaths[$pos]);
}
}
array_unshift(self::$_includePaths,$path);
if (self::$enableIncludePath && set_include_path('.' . PATH_SEPARATOR . implode(PATH_SEPARATOR,self::$_includePaths)) === false) {
self::$enableIncludePath = false;
}
return self::$_imports[$alias] = $path;
}
} else {
throw new CException(Yii::t('yii',array('{alias}' => $alias)));
}
}

是的,上面这个方法最后就把要加载的东西都放到$_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() 语句。

原文链接:https://www.f2er.com/php/20188.html

猜你在找的PHP相关文章