包 | system |
---|---|
继承 | class YiiBase |
子类 | Yii |
源自 | 1.0 |
版本 | $Id: YiiBase.php 3564 2012-02-13 01:29:03Z qiang.xue $ |
源码 |
公共属性
属性 | 类型 | 描述 | 定义在 |
---|---|---|---|
classMap | array | 用于Yii的自动加载类地图. | YiiBase |
enableIncludePath | boolean | 是否要依靠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 |
属性详细
用于Yii的自动加载类地图. 数组中的键是类名,数组中的值是相应类文件的路径。
是否要依靠PHP包含路径到自动加载类文件。默认为true。 如果你的宿主环境不允许你改变PHP包含路径,可以设置为false。 或者你想添加另外的自动加载器到默认的Yii自动加载器。
方法详细
public static CApplication app()
| ||
{return} | CApplication | 应用程序单例。如果单例还没创建为null。 |
public static function app()
{
return self::$_app;
}
返回应用程序单例,如果单例还没创建为null。
public static boolean autoload(string $className)
| ||
$className | string | 类名 |
{return} | boolean | 是否该类已经被成功载入 |
public static function autoload($className)
{
// use include so that the error PHP file may appear
if(isset(self::$classMap[$className]))
include(self::$classMap[$className]);
else if(isset(self::$_coreClasses[$className]))
include(YII_PATH.self::$_coreClasses[$className]);
else
{
// include class file relying on include_path
if(strpos($className,'\\')===false) // class without namespace
{
if(self::$enableIncludePath===false)
{
foreach(self::$_includePaths as $path)
{
$classFile=$path.DIRECTORY_SEPARATOR.$className.'.php';
if(is_file($classFile))
{
include($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) || interface_exists($className,false);
}
return true;
}
类自动加载器。 这个方法是提供给__autoload()魔术方法使用。
public static void beginProfile(string $token, string $category='application')
| ||
$token | string | 代码块标记 |
$category | string | 日志信息类别 |
public static function beginProfile($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');
参见
public static mixed createApplication(string $class, mixed $config=NULL)
| ||
$class | string | 应用程序类名 |
$config | mixed | 应用程序配置。 这个参数将会传递给应用程序类的构造函数。 |
{return} | mixed | 这个应用程序实例 |
public static function createApplication($class,$config=null)
{
return new $class($config);
}
创建一个指定类的应用程序。
public static mixed createComponent(mixed $config)
| ||
$config | mixed | 配置,它可能是一个字符串或数组。 |
{return} | mixed | 创建后的对象 |
public static function createComponent($config)
{
if(is_string($config))
{
$type=$config;
$config=array();
}
else if(isset($config['class']))
{
$type=$config['class'];
unset($config['class']);
}
else
throw new CException(Yii::t('yii','Object configuration must be an array containing a "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]);
else if($n===3)
$object=new $type($args[1],$args[2]);
else if($n===4)
$object=new $type($args[1],$args[2],$args[3]);
else
{
unset($args[0]);
$class=new ReflectionClass($type);
// Note: ReflectionClass::newInstanceArgs() is available for PHP 5.1.3+
// $object=$class->newInstanceArgs($args);
$object=call_user_func_array(array($class,'newInstance'),$args);
}
}
else
$object=new $type;
foreach($config as $key=>$value)
$object->$key=$value;
return $object;
}
创建一个对象并根据指定的配置初始化。
指定的配置可以是一个字符串或一个数组。
如果是前者,该字符串被当作(指定一个类名的)对象类型,或
类的路径别名。
如果是后者,‘class’元素对当作对象类型对待,
并且数组中其余的键值对被用作初始化
相应的对象属性。
传递给这个方法的任何额外的参数
将传递给将要创建的对象的构造方法。
public static CConsoleApplication createConsoleApplication(mixed $config=NULL)
| ||
$config | mixed | 应用程序配置。 如果是一个字符串,它将被当作文件的路径,其中包含配置; 如果是一个数组,它将被当作具体的配置信息。 请务必在配置文件中指定basePath属性, 通常应该指向目录包含所有的应用程序逻辑,模板和数据。 如果没有,那么默认将指定为‘protected’目录。 |
{return} | CConsoleApplication |
public static function createConsoleApplication($config=null)
{
return self::createApplication('CConsoleApplication',$config);
}
创建一个控制台应用程序实例。
public static CWebApplication createWebApplication(mixed $config=NULL)
| ||
$config | mixed | 应用程序配置。 如果是一个字符串,它将被当作文件的路径,其中含有配置; 如果是一个数组,它将被当作具体的配置信息。 请务必在配置文件中指定basePath属性, 通常应该指向目录包含所有的应用程序逻辑、模板和数据。 如果没有,那么默认将指定为‘protected’目录。 |
{return} | CWebApplication |
public static function createWebApplication($config=null)
{
return self::createApplication('CWebApplication',$config);
}
创建一个Web应用程序实例。
public static void endProfile(string $token, string $category='application')
| ||
$token | string | 代码块标记 |
$category | string | 日志信息类别 |
public static function endProfile($token,$category='application')
{
self::log('end:'.$token,CLogger::LEVEL_PROFILE,$category);
}
标记分析一块代码的结束位置。 标记分析一块代码结束位置。它必须有一个同样的beginProfile()匹配。
参见
public static string getFrameworkPath()
| ||
{return} | string | 框架的路径 |
public static function getFrameworkPath()
{
return YII_PATH;
}
public static CLogger getLogger()
| ||
{return} | CLogger | 日志信息器 |
public static function getLogger()
{
if(self::$_logger!==null)
return self::$_logger;
else
return self::$_logger=new CLogger;
}
public static mixed getPathOfAlias(string $alias)
| ||
$alias | string | 别名(例如:system.web.CController) |
{return} | mixed | 别名对应的文件路径,如果名称无效返回false。 |
public static function getPathOfAlias($alias)
{
if(isset(self::$_aliases[$alias]))
return self::$_aliases[$alias];
else if(($pos=strpos($alias,'.'))!==false)
{
$rootAlias=substr($alias,0,$pos);
if(isset(self::$_aliases[$rootAlias]))
return self::$_aliases[$alias]=rtrim(self::$_aliases[$rootAlias].DIRECTORY_SEPARATOR.str_replace('.',DIRECTORY_SEPARATOR,substr($alias,$pos+1)),'*'.DIRECTORY_SEPARATOR);
else if(self::$_app instanceof CWebApplication)
{
if(self::$_app->findModule($rootAlias)!==null)
return self::getPathOfAlias($alias);
}
}
return false;
}
翻译一个别名为一个文件路径。 注意,这个方法不能保证返回的文件路径存在。 它仅检测别名的根目录是否有效。
public static string getVersion()
| ||
{return} | string | 返回Yii framework版本号 |
public static function getVersion()
{
return '1.1.10';
}
public static string import(string $alias, boolean $forceInclude=false)
| ||
$alias | string | 导入的路径别名 |
$forceInclude | boolean | 是否立即包含类文件。 如果为flase,则类文件仅在被使用时包含。 这个参数仅当使用一个类的路径别名时才会用到。 |
{return} | string | 别名所指的类名或目录 |
public static function import($alias,$forceInclude=false)
{
if(isset(self::$_imports[$alias])) // previously imported
return self::$_imports[$alias];
if(class_exists($alias,false) || interface_exists($alias,false))
return self::$_imports[$alias]=$alias;
if(($pos=strrpos($alias,'\\'))!==false) // a class name in PHP 5.3 namespace format
{
$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
throw new CException(Yii::t('yii','Alias "{alias}" is invalid. Make sure it points to an existing PHP file.',array('{alias}'=>$alias)));
self::$_imports[$alias]=$alias;
}
else
self::$classMap[$alias]=$classFile;
return $alias;
}
else
throw new CException(Yii::t('yii','Alias "{alias}" is invalid. Make sure it points to an existing directory.',
array('{alias}'=>$namespace)));
}
if(($pos=strrpos($alias,'.'))===false) // a simple class name
{
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)))
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','Alias "{alias}" is invalid. Make sure it points to an existing PHP file.',array('{alias}'=>$alias)));
self::$_imports[$alias]=$className;
}
else
self::$classMap[$className]=$path.'.php';
return $className;
}
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','Alias "{alias}" is invalid. Make sure it points to an existing directory or file.',
array('{alias}'=>$alias)));
}
导入一个类或一个目录。
导入一个类就像包含相应的类文件。
主要区别是导入一个类比较轻巧,
它仅在类文件首次引用时包含。
导入一个目录相当于添加一个目录到PHP包含路径中。
如果有多个目录被导入,在类文件搜索时,
后导入的目录优先于之前导入目录(例如,它们被添加到了PHP包含路径的前面)。
路径别名是用来导入一个类或目录。例如,
-
application.components.GoogleMap
: import theGoogleMap
class. -
application.components.*
: import thecomponents
directory.
相同的路径别名可以多次导入,但只有首次有效。 导入一个目录将不会导入其下面的任何子目录。
从1.1.5版本开始,这个方法也可以使用命令空间格式导入一个类 (仅PHP 5.3及以上版本可用)。 它类似使用路径别名格式导入一个类, 除了“.”分隔符被替换成“\”分隔符,例如,导入
application\components\GoogleMap
与导入application.components.GoogleMap
相似。
不同的是前者使用合法的名称,后者是不合法的。
注意,如果我们使用反斜线代替点号 使用命名空间格式导入一个类要求命名空间相对应于一个有效的路径别名。 例如,命名空间
application\components
必须对应一个有效的
路径别名application.components
。
public static void log(string $msg, string $level='info', string $category='application')
| ||
$msg | string | 日志信息 |
$level | string | 信息等级(例如‘trace’,‘warning’,‘error’)。它大小写不敏感。 |
$category | string | 信息类别(例如‘system.web’)。它大小写不敏感。 |
public static function log($msg,$level=CLogger::LEVEL_INFO,$category='application')
{
if(self::$_logger===null)
self::$_logger=new CLogger;
if(YII_DEBUG && YII_TRACE_LEVEL>0 && $level!==CLogger::LEVEL_PROFILE)
{
$traces=debug_backtrace();
$count=0;
foreach($traces as $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。
public static string powered()
| ||
{return} | string | 一个可以在你的网页上显示的Powered-by-Yii信息 |
public static function powered()
{
return Yii::t('yii','Powered by {yii}.', array('{yii}'=>'<a href="http://www.yiiframework.com/" rel="external">Yii Framework</a>'));
}
返回一个可以在网页中显示的Powered-by-Yii字符串信息
public static void registerAutoloader(callback $callback, boolean $append=false)
| ||
$callback | callback | 一个有效的PHP回调(函数名或array($className,$methodName))). |
$append | boolean | 是否在默认的Yii类自动加载器后附加新的类自动加载器。 |
public static function registerAutoloader($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之前或 其他已经存在的加载器之后。
public static void setApplication(CApplication $app)
| ||
$app | CApplication | 应用程序实例。如果为null, 这个已经存在的应用程序实例将被移除。 |
public static function setApplication($app)
{
if(self::$_app===null || $app===null)
self::$_app=$app;
else
throw new CException(Yii::t('yii','Yii application can only be created once.'));
}
在类静态成员中存储应用程序实例。 这个方法帮助实现CApplication的单例模块。 重复调用该方法或CApplication构造器 将抛出一个异常。 使用app()获取应用程序实例。
public static void setLogger(CLogger $logger)
| ||
$logger | CLogger | 日志记录器对象。 |
public static function setLogger($logger)
{
self::$_logger=$logger;
}
设置日志记录器对象。
public static void setPathOfAlias(string $alias, string $path)
| ||
$alias | string | 路径别名 |
$path | string | 对应的路径别名,如果为null, 则对应的路径别名将被移除。 |
public static function setPathOfAlias($alias,$path)
{
if(empty($path))
unset(self::$_aliases[$alias]);
else
self::$_aliases[$alias]=rtrim($path,'\\/');
}
创建一个路径别名。 注意,该方法既不检测路径是否存在也不检测是否规范。
public static string t(string $category, string $message, array $params=array (
), string $source=NULL, string $language=NULL)
| ||
$category | string | 信息类别。请仅使用一个单词字母。 注意,类别‘yii’是预留给Yii框架核心代码使用的,参考CPhpMessageSource 获取更多关于信息类别的解释。 |
$message | string | 原始信息 |
$params | array | 参数被应用到信息中使用的strtr 。
第一个参数可以是一个没有键的数字。
并且在这种情况下,这个方法将调用CChoiceFormat::format
选择一个适当的信息(进行)翻译。
自1.1.6开始,你为CChoiceFormat::format
传递复数参数不必封装成数组。 |
$source | string | 指定消息源使用的应用组件。 默认为null,意思是消息使用的‘coreMessages’属于‘yii’类别, 而剩余的消息使用‘messages’。 |
$language | string | 目标语言。如果为空(默认),将使用application language。 |
{return} | string | 已翻译的信息 |
public static function t($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])) // number choice
{
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), 例如,根据给定的数字值从几个侯选条件中返回消息。 假设一条信息在一些语言中有不同的复数格式, 此功能主要用来解决复数格式问题。
public static void trace(string $msg, string $category='application')
| ||
$msg | string | 日志信息 |
$category | string | 消息类别 |
public static function trace($msg,$category='application')
{
if(YII_DEBUG)
self::log($msg,CLogger::LEVEL_TRACE,$category);
}
写入一条跟踪信息。 这个方法仅在调试模式下写入一条日志。