YiiBase

优质
小牛编辑
137浏览
2023-12-01
所有包 | 属性 | 方法
system
继承class YiiBase
子类Yii
源自1.0
版本$Id: YiiBase.php 3564 2012-02-13 01:29:03Z qiang.xue $
源码framework/YiiBase.php
YiiBase是一个助手类,它服务于整个框架。

不要直接使用YiiBase。相反,你应该使用它的子类Yii, 你可以在Yii中定制YiiBase的方法。

公共属性

隐藏继承属性

属性类型描述定义在
classMaparray用于Yii的自动加载类地图.YiiBase
enableIncludePathboolean是否要依靠PHP包含路径到自动加载类文件。默认为true。 如果你的宿主环境不允许你改变PHP包含路径,可以设置为false。 或者你想添加另外的自动加载器到默认的Yii自动加载器。YiiBase

公共方法

隐藏继承方法

方法描述定义在
app()返回应用程序单例,如果单例还没创建为null。YiiBase
autoload()类自动加载器。YiiBase
beginProfile()标记分析一块代码的开始位置。YiiBase
createApplication()创建一个指定类的应用程序。YiiBase
createComponent()创建一个对象并根据指定的配置初始化。YiiBase
createConsoleApplication()创建一个控制台应用程序实例。YiiBase
createWebApplication()创建一个Web应用程序实例。YiiBase
endProfile()标记分析一块代码的结束位置。YiiBase
getFrameworkPath()返回框架的路径YiiBase
getLogger()返回日志信息器YiiBase
getPathOfAlias()翻译一个别名为一个文件路径。YiiBase
getVersion()返回返回Yii framework版本号YiiBase
import()导入一个类或一个目录。YiiBase
log()写入一条日志信息。YiiBase
powered()返回一个可以在网页中显示的Powered-by-Yii字符串信息YiiBase
registerAutoloader()注册一个新的类自动加载器。YiiBase
setApplication()在类静态成员中存储应用程序实例。YiiBase
setLogger()设置日志记录器对象。YiiBase
setPathOfAlias()创建一个路径别名。YiiBase
t()翻译一条为指定语言的信息。YiiBase
trace()写入一条跟踪信息。YiiBase

属性详细

classMap 属性 (可用自 v1.1.5) public static array $classMap;

用于Yii的自动加载类地图. 数组中的键是类名,数组中的值是相应类文件的路径。

enableIncludePath 属性 (可用自 v1.1.8) public static boolean $enableIncludePath;

是否要依靠PHP包含路径到自动加载类文件。默认为true。 如果你的宿主环境不允许你改变PHP包含路径,可以设置为false。 或者你想添加另外的自动加载器到默认的Yii自动加载器。

方法详细

app() 方法
public static CApplication app()
{return}CApplication应用程序单例。如果单例还没创建为null。
源码: framework/YiiBase.php#134 (显示) publicstaticfunctionapp()
{
returnself::$_app;
}

返回应用程序单例,如果单例还没创建为null。

autoload() 方法
public static boolean autoload(string $className)
$classNamestring类名
{return}boolean是否该类已经被成功载入
源码: framework/YiiBase.php#393 (显示) publicstaticfunctionautoload($className)
{
//useincludesothattheerrorPHPfilemayappear
if(isset(self::$classMap[$className]))
include(self::$classMap[$className]);
elseif(isset(self::$_coreClasses[$className]))
include(YII_PATH.self::$_coreClasses[$className]);
else
{
//includeclassfilerelyingoninclude_path
if(strpos($className,'\')===false)//classwithoutnamespace
{
if(self::$enableIncludePath===false)
{
foreach(self::$_includePathsas$path)
{
$classFile=$path.DIRECTORY_SEPARATOR.$className.'.php';
if(is_file($classFile))
{
include($classFile);
break;
}
}
}
else
include($className.'.php');
}
else//classnamewithnamespaceinPHP5.3
{
$namespace=str_replace('\','.',ltrim($className,'\'));
if(($path=self::getPathOfAlias($namespace))!==false)
include($path.'.php');
else
returnfalse;
}
returnclass_exists($className,false)||interface_exists($className,false);
}
returntrue;
}

类自动加载器。 这个方法是提供给__autoload()魔术方法使用。

beginProfile() 方法
public static void beginProfile(string $token, string $category='application')
$tokenstring代码块标记
$categorystring日志信息类别
源码: framework/YiiBase.php#497 (显示) publicstaticfunctionbeginProfile($token,$category='application')
{
self::log('begin:'.$token,CLogger::LEVEL_PROFILE,$category);
}

标记分析一块代码的开始位置。 标记开始分析一块代码。它必须有一个同样的endProfile()匹配。 begin-和end-调用必须是正确的嵌套,例如,

Yii::beginProfile('block1');
Yii::beginProfile('block2');
Yii::endProfile('block2');
Yii::endProfile('block1');
下面的语句是无效的:
Yii::beginProfile('block1');
Yii::beginProfile('block2');
Yii::endProfile('block1');
Yii::endProfile('block2');

参见

  • endProfile
createApplication() 方法
public static mixed createApplication(string $class, mixed $config=NULL)
$classstring应用程序类名
$configmixed应用程序配置。 这个参数将会传递给应用程序类的构造函数。
{return}mixed这个应用程序实例
源码: framework/YiiBase.php#125 (显示) publicstaticfunctioncreateApplication($class,$config=null)
{
returnnew$class($config);
}

创建一个指定类的应用程序。

createComponent() 方法
public static mixed createComponent(mixed $config)
$configmixed配置,它可能是一个字符串或数组。
{return}mixed创建后的对象
源码: framework/YiiBase.php#182 (显示) publicstaticfunctioncreateComponent($config)
{
if(is_string($config))
{
$type=$config;
$config=array();
}
elseif(isset($config['class']))
{
$type=$config['class'];
unset($config['class']);
}
else
thrownewCException(Yii::t('yii','Objectconfigurationmustbeanarraycontaininga"class"element.'));

if(!class_exists($type,false))
$type=Yii::import($type,true);

if(($n=func_num_args())>1)
{
$args=func_get_args();
if($n===2)
$object=new$type($args[1]);
elseif($n===3)
$object=new$type($args[1],$args[2]);
elseif($n===4)
$object=new$type($args[1],$args[2],$args[3]);
else
{
unset($args[0]);
$class=newReflectionClass($type);
//Note:ReflectionClass::newInstanceArgs()isavailableforPHP5.1.3+
//$object=$class->newInstanceArgs($args);
$object=call_user_func_array(array($class,'newInstance'),$args);
}
}
else
$object=new$type;

foreach($configas$key=>$value)
$object->$key=$value;

return$object;
}

创建一个对象并根据指定的配置初始化。

指定的配置可以是一个字符串或一个数组。 如果是前者,该字符串被当作(指定一个类名的)对象类型,或 类的路径别名。 如果是后者,‘class’元素对当作对象类型对待, 并且数组中其余的键值对被用作初始化 相应的对象属性。

传递给这个方法的任何额外的参数 将传递给将要创建的对象的构造方法。

createConsoleApplication() 方法
public static CConsoleApplication createConsoleApplication(mixed $config=NULL)
$configmixed应用程序配置。 如果是一个字符串,它将被当作文件的路径,其中包含配置; 如果是一个数组,它将被当作具体的配置信息。 请务必在配置文件中指定basePath属性, 通常应该指向目录包含所有的应用程序逻辑,模板和数据。 如果没有,那么默认将指定为‘protected’目录。
{return}CConsoleApplication
源码: framework/YiiBase.php#113 (显示) publicstaticfunctioncreateConsoleApplication($config=null)
{
returnself::createApplication('CConsoleApplication',$config);
}

创建一个控制台应用程序实例。

createWebApplication() 方法
public static CWebApplication createWebApplication(mixed $config=NULL)
$configmixed应用程序配置。 如果是一个字符串,它将被当作文件的路径,其中含有配置; 如果是一个数组,它将被当作具体的配置信息。 请务必在配置文件中指定basePath属性, 通常应该指向目录包含所有的应用程序逻辑、模板和数据。 如果没有,那么默认将指定为‘protected’目录。
{return}CWebApplication
源码: framework/YiiBase.php#98 (显示) publicstaticfunctioncreateWebApplication($config=null)
{
returnself::createApplication('CWebApplication',$config);
}

创建一个Web应用程序实例。

endProfile() 方法
public static void endProfile(string $token, string $category='application')
$tokenstring代码块标记
$categorystring日志信息类别
源码: framework/YiiBase.php#509 (显示) publicstaticfunctionendProfile($token,$category='application')
{
self::log('end:'.$token,CLogger::LEVEL_PROFILE,$category);
}

标记分析一块代码的结束位置。 标记分析一块代码结束位置。它必须有一个同样的beginProfile()匹配。

参见

  • beginProfile
getFrameworkPath() 方法
public static string getFrameworkPath()
{return}string框架的路径
源码: framework/YiiBase.php#160 (显示) publicstaticfunctiongetFrameworkPath()
{
returnYII_PATH;
}
getLogger() 方法
public static CLogger getLogger()
{return}CLogger日志信息器
源码: framework/YiiBase.php#517 (显示) publicstaticfunctiongetLogger()
{
if(self::$_logger!==null)
returnself::$_logger;
else
returnself::$_logger=newCLogger;
}
getPathOfAlias() 方法
public static mixed getPathOfAlias(string $alias)
$aliasstring别名(例如:system.web.CController)
{return}mixed别名对应的文件路径,如果名称无效返回false。
源码: framework/YiiBase.php#354 (显示) publicstaticfunctiongetPathOfAlias($alias)
{
if(isset(self::$_aliases[$alias]))
returnself::$_aliases[$alias];
elseif(($pos=strpos($alias,'.'))!==false)
{
$rootAlias=substr($alias,0,$pos);
if(isset(self::$_aliases[$rootAlias]))
returnself::$_aliases[$alias]=rtrim(self::$_aliases[$rootAlias].DIRECTORY_SEPARATOR.str_replace('.',DIRECTORY_SEPARATOR,substr($alias,$pos+1)),'*'.DIRECTORY_SEPARATOR);
elseif(self::$_appinstanceofCWebApplication)
{
if(self::$_app->findModule($rootAlias)!==null)
returnself::getPathOfAlias($alias);
}
}
returnfalse;
}

翻译一个别名为一个文件路径。 注意,这个方法不能保证返回的文件路径存在。 它仅检测别名的根目录是否有效。

getVersion() 方法
public static string getVersion()
{return}string返回Yii framework版本号
源码: framework/YiiBase.php#83 (显示) publicstaticfunctiongetVersion()
{
return'1.1.10';
}
import() 方法
public static string import(string $alias, boolean $forceInclude=false)
$aliasstring导入的路径别名
$forceIncludeboolean是否立即包含类文件。 如果为flase,则类文件仅在被使用时包含。 这个参数仅当使用一个类的路径别名时才会用到。
{return}string别名所指的类名或目录
源码: framework/YiiBase.php#265 (显示) publicstaticfunctionimport($alias,$forceInclude=false)
{
if(isset(self::$_imports[$alias]))//previouslyimported
returnself::$_imports[$alias];

if(class_exists($alias,false)||interface_exists($alias,false))
returnself::$_imports[$alias]=$alias;

if(($pos=strrpos($alias,'\'))!==false)//aclassnameinPHP5.3namespaceformat
{
$namespace=str_replace('\','.',ltrim(substr($alias,0,$pos),'\'));
if(($path=self::getPathOfAlias($namespace))!==false)
{
$classFile=$path.DIRECTORY_SEPARATOR.substr($alias,$pos+1).'.php';
if($forceInclude)
{
if(is_file($classFile))
require($classFile);
else
thrownewCException(Yii::t('yii','Alias"{alias}"isinvalid.MakesureitpointstoanexistingPHPfile.',array('{alias}'=>$alias)));
self::$_imports[$alias]=$alias;
}
else
self::$classMap[$alias]=$classFile;
return$alias;
}
else
thrownewCException(Yii::t('yii','Alias"{alias}"isinvalid.Makesureitpointstoanexistingdirectory.',
array('{alias}'=>$namespace)));
}

if(($pos=strrpos($alias,'.'))===false)//asimpleclassname
{
if($forceInclude&&self::autoload($alias))
self::$_imports[$alias]=$alias;
return$alias;
}

$className=(string)substr($alias,$pos+1);
$isClass=$className!=='*';

if($isClass&&(class_exists($className,false)||interface_exists($className,false)))
returnself::$_imports[$alias]=$className;

if(($path=self::getPathOfAlias($alias))!==false)
{
if($isClass)
{
if($forceInclude)
{
if(is_file($path.'.php'))
require($path.'.php');
else
thrownewCException(Yii::t('yii','Alias"{alias}"isinvalid.MakesureitpointstoanexistingPHPfile.',array('{alias}'=>$alias)));
self::$_imports[$alias]=$className;
}
else
self::$classMap[$className]=$path.'.php';
return$className;
}
else//adirectory
{
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;

returnself::$_imports[$alias]=$path;
}
}
else
thrownewCException(Yii::t('yii','Alias"{alias}"isinvalid.Makesureitpointstoanexistingdirectoryorfile.',
array('{alias}'=>$alias)));
}

导入一个类或一个目录。

导入一个类就像包含相应的类文件。 主要区别是导入一个类比较轻巧, 它仅在类文件首次引用时包含。

导入一个目录相当于添加一个目录到PHP包含路径中。 如果有多个目录被导入,在类文件搜索时, 后导入的目录优先于之前导入目录(例如,它们被添加到了PHP包含路径的前面)。

路径别名是用来导入一个类或目录。例如,

  • application.components.GoogleMap: import the GoogleMap class.
  • application.components.*: import the components directory.


相同的路径别名可以多次导入,但只有首次有效。 导入一个目录将不会导入其下面的任何子目录。

从1.1.5版本开始,这个方法也可以使用命令空间格式导入一个类 (仅PHP 5.3及以上版本可用)。 它类似使用路径别名格式导入一个类, 除了“.”分隔符被替换成“”分隔符,例如,导入 applicationcomponentsGoogleMap与导入application.components.GoogleMap相似。 不同的是前者使用合法的名称,后者是不合法的。

注意,如果我们使用反斜线代替点号 使用命名空间格式导入一个类要求命名空间相对应于一个有效的路径别名。 例如,命名空间applicationcomponents必须对应一个有效的 路径别名application.components

log() 方法
public static void log(string $msg, string $level='info', string $category='application')
$msgstring日志信息
$levelstring信息等级(例如‘trace’,‘warning’,‘error’)。它大小写不敏感。
$categorystring信息类别(例如‘system.web’)。它大小写不敏感。
源码: framework/YiiBase.php#455 (显示) publicstaticfunctionlog($msg,$level=CLogger::LEVEL_INFO,$category='application')
{
if(self::$_logger===null)
self::$_logger=newCLogger;
if(YII_DEBUG&&YII_TRACE_LEVEL>0&&$level!==CLogger::LEVEL_PROFILE)
{
$traces=debug_backtrace();
$count=0;
foreach($tracesas$trace)
{
if(isset($trace['file'],$trace['line'])&&strpos($trace['file'],YII_PATH)!==0)
{
$msg.="nin".$trace['file'].'('.$trace['line'].')';
if(++$count>=YII_TRACE_LEVEL)
break;
}
}
}
self::$_logger->log($msg,$level,$category);
}

写入一条日志信息。 日志信息可以通过这个方法CLogger::getLogs 返回并且可以使用CLogRouter 记录在不同媒体上,例如:file,email,database。

powered() 方法
public static string powered()
{return}string一个可以在你的网页上显示的Powered-by-Yii信息
源码: framework/YiiBase.php#539 (显示) publicstaticfunctionpowered()
{
returnYii::t('yii','Poweredby{yii}.',array('{yii}'=>'<ahref="http://www.yiiframework.com/"rel="external">YiiFramework</a>'));
}

返回一个可以在网页中显示的Powered-by-Yii字符串信息

registerAutoloader() 方法
public static void registerAutoloader(callback $callback, boolean $append=false)
$callbackcallback一个有效的PHP回调(函数名或array($className,$methodName))).
$appendboolean是否在默认的Yii类自动加载器后附加新的类自动加载器。
源码: framework/YiiBase.php#612 (显示) publicstaticfunctionregisterAutoloader($callback,$append=false)
{
if($append)
{
self::$enableIncludePath=false;
spl_autoload_register($callback);
}
else
{
spl_autoload_unregister(array('YiiBase','autoload'));
spl_autoload_register($callback);
spl_autoload_register(array('YiiBase','autoload'));
}
}

注册一个新的类自动加载器。 新的类自动加载器将置于autoload之前或 其他已经存在的加载器之后。

setApplication() 方法
public static void setApplication(CApplication $app)
$appCApplication应用程序实例。如果为null, 这个已经存在的应用程序实例将被移除。
源码: framework/YiiBase.php#149 (显示) publicstaticfunctionsetApplication($app)
{
if(self::$_app===null||$app===null)
self::$_app=$app;
else
thrownewCException(Yii::t('yii','Yiiapplicationcanonlybecreatedonce.'));
}

在类静态成员中存储应用程序实例。 这个方法帮助实现CApplication的单例模块。 重复调用该方法或CApplication构造器 将抛出一个异常。 使用app()获取应用程序实例。

setLogger() 方法 (可用自 v1.1.8)
public static void setLogger(CLogger $logger)
$loggerCLogger日志记录器对象。
源码: framework/YiiBase.php#530 (显示) publicstaticfunctionsetLogger($logger)
{
self::$_logger=$logger;
}

设置日志记录器对象。

setPathOfAlias() 方法
public static void setPathOfAlias(string $alias, string $path)
$aliasstring路径别名
$pathstring对应的路径别名,如果为null, 则对应的路径别名将被移除。
源码: framework/YiiBase.php#379 (显示) publicstaticfunctionsetPathOfAlias($alias,$path)
{
if(empty($path))
unset(self::$_aliases[$alias]);
else
self::$_aliases[$alias]=rtrim($path,'\/');
}

创建一个路径别名。 注意,该方法既不检测路径是否存在也不检测是否规范。

t() 方法
public static string t(string $category, string $message, array $params=array ( ), string $source=NULL, string $language=NULL)
$categorystring信息类别。请仅使用一个单词字母。 注意,类别‘yii’是预留给Yii框架核心代码使用的,参考CPhpMessageSource 获取更多关于信息类别的解释。
$messagestring原始信息
$paramsarray参数被应用到信息中使用的strtr。 第一个参数可以是一个没有键的数字。 并且在这种情况下,这个方法将调用CChoiceFormat::format 选择一个适当的信息(进行)翻译。 自1.1.6开始,你为CChoiceFormat::format 传递复数参数不必封装成数组。
$sourcestring指定消息源使用的应用组件。 默认为null,意思是消息使用的‘coreMessages’属于‘yii’类别, 而剩余的消息使用‘messages’。
$languagestring目标语言。如果为空(默认),将使用application language。
{return}string已翻译的信息
源码: framework/YiiBase.php#567 (显示) publicstaticfunctiont($category,$message,$params=array(),$source=null,$language=null)
{
if(self::$_app!==null)
{
if($source===null)
$source=($category==='yii'||$category==='zii')?'coreMessages':'messages';
if(($source=self::$_app->getComponent($source))!==null)
$message=$source->translate($category,$message,$language);
}
if($params===array())
return$message;
if(!is_array($params))
$params=array($params);
if(isset($params[0]))//numberchoice
{
if(strpos($message,'|')!==false)
{
if(strpos($message,'#')===false)
{
$chunks=explode('|',$message);
$expressions=self::$_app->getLocale($language)->getPluralRules();
if($n=min(count($chunks),count($expressions)))
{
for($i=0;$i<$n;$i++)
$chunks[$i]=$expressions[$i].'#'.$chunks[$i];

$message=implode('|',$chunks);
}
}
$message=CChoiceFormat::format($message,$params[0]);
}
if(!isset($params['{n}']))
$params['{n}']=$params[0];
unset($params[0]);
}
return$params!==array()?strtr($message,$params):$message;
}

翻译一条为指定语言的信息。 这个方法支持选择格式(参见CChoiceFormat), 例如,根据给定的数字值从几个侯选条件中返回消息。 假设一条信息在一些语言中有不同的复数格式, 此功能主要用来解决复数格式问题。

参见

  • CMessageSource
trace() 方法
public static void trace(string $msg, string $category='application')
$msgstring日志信息
$categorystring消息类别
源码: framework/YiiBase.php#440 (显示) publicstaticfunctiontrace($msg,$category='application')
{
if(YII_DEBUG)
self::log($msg,CLogger::LEVEL_TRACE,$category);
}

写入一条跟踪信息。 这个方法仅在调试模式下写入一条日志。

参见

  • log