Yii源码阅读笔记(三)
接着上次的继续阅读BaseYii.php
vendor/yiisoft/yii2/BaseYii.php——
public static function getRootAlias($alias)//获取根别名
{ //查找别名中斜线的位置
$pos = strpos($alias, '/'); //根据斜线的结果判断,如果不包含斜线,表示输入为根别名,否则截取斜线前面的部分作为根别名
$root = $pos === false ? $alias : substr($alias, 0, $pos);
//判断根别名是否存在
if (isset(static::$aliases[$root])) {
if (is_string(static::$aliases[$root])) {//判断根别名的值即路径是否为字符串,如果是,返回根别名
return $root;
} else {//否则遍历别名数组,通过查找字符串函数找到根别名,返回
foreach (static::$aliases[$root] as $name => $path) {
if (strpos($alias . '/', $name . '/') === 0) {
return $name;
}
}
}
}
return false;
}
类自动加载方法:
public static function autoload($className)
{
if (isset(static::$classMap[$className])) {//判断传入的类是否在定义的$classMap数组常量中
$classFile = static::$classMap[$className];//如果在,则类的路径为类名对应的路径即数组的值
if ($classFile[0] === '@') {//取路径的第一个字符判断是否为@,如果是,则包含别名
$classFile = static::getAlias($classFile);//解析别名作为类文件路径
}
} elseif (strpos($className, '\\') !== false) {//如果传入的类名不在$classMap数组中,且传入的类名为路径
$classFile = static::getAlias('@' . str_replace('\\', '/', $className) . '.php', false);//拼接出类文件路径,支持别名
if ($classFile === false || !is_file($classFile)) {//如果类文件不存在,则返回
return;
}
} else {//路径不正确,返回
return;
}
include($classFile);//包含类文件
if (YII_DEBUG && !class_exists($className, false) && !interface_exists($className, false) && !trait_exists($className, false)) {
throw new UnknownClassException("Unable to find '$className' in file: $classFile. Namespace missing?");//判断类是否存在,不存在抛出异常
}
}
创建对象方法:
public static function createObject($type, array $params = [])
{
if (is_string($type)) {//判断输入的参数$type是否为字符串
return static::$container->get($type, $params);//如果是字符串,调用$container 的get方法获取对象并返回
} elseif (is_array($type) && isset($type['class'])) {//判断参数$type是否为数组,并且数组中是否有类名称
$class = $type['class'];//如果有,则类名为数组中class键的值
unset($type['class']);//注销$type 中的类名称作为下面的配置参数--详见get方法
return static::$container->get($class, $params, $type);//通过类名称获取对象
} elseif (is_callable($type, true)) {//判断参数$type是否为可调用的函数
return call_user_func($type, $params);//调用函数并返回
} elseif (is_array($type)) {//参数$type是数组但不包含类名,抛出异常
throw new InvalidConfigException('Object configuration must be an array containing a "class" element.');
} else {//输入不合法,抛出异常
throw new InvalidConfigException('Unsupported configuration type: ' . gettype($type));
}
}
获取日志记录方法:
private static $_logger;//声明静态变量
/**
* @return Logger message logger
*/
public static function getLogger()
{
if (self::$_logger !== null) {//如果当前的静态变量不为空,返回$_logger
return self::$_logger;
} else {
return self::$_logger = static::createObject('yii\log\Logger');//否则,返回yii\log\Logger方法
}
}
设置日志记录方法:
public static function setLogger($logger)
{
self::$_logger = $logger;//将传入的$logger赋值给静态变量$_logger
}
日志记录trace信息方法:
public static function trace($message, $category = 'application')//参数为trace信息和信息类型
{
if (YII_DEBUG) {//如果定义的YII_DEBUG
static::getLogger()->log($message, Logger::LEVEL_TRACE, $category);//通过logger类中的log方法输出trace信息
}
}
日志记录error信息方法:
public static function error($message, $category = 'application')//参数为错误信息和信息类型
{
}
操作信息日志:
public static function info($message, $category = 'application')//参数为操作消息和消息类型
{
static::getLogger()->log($message, Logger::LEVEL_INFO, $category);//输出日志
}
开始性能分析方法:
public static function beginProfile($token, $category = 'application')
{
static::getLogger()->log($token, Logger::LEVEL_PROFILE_BEGIN, $category);//输出性能分析开始记录
}
结束性能分析方法:
public static function endProfile($token, $category = 'application')
{
static::getLogger()->log($token, Logger::LEVEL_PROFILE_END, $category);//输出性能分析结束记录
}
输出power信息方法:
public static function powered()
{
return \Yii::t('yii', 'Powered by {yii}', [
'yii' => '<a href="http://www.yiiframework.com/" rel="external">' . \Yii::t('yii',
'Yii Framework') . '</a>'
]);//返回power by 信息
}
短方法t(语言翻译方法):
public static function t($category, $message, $params = [], $language = null)//\yii\i18n\I18N::translate()方法的短方法
{
if (static::$app !== null) {//如果 \yii\console\Application|yii\web\Application 实例为空
return static::$app->getI18n()->translate($category, $message, $params, $language ?: static::$app->language); //调用translate()方法,用$params中的值替换$message中对应的值,$language为空,采用默认语言
} else {
$p = [];
foreach ((array) $params as $name => $value) {//否则,遍历$params
$p['{' . $name . '}'] = $value;//以$params 的名和值构建索引数组
}
return ($p === []) ? $message : strtr($message, $p);//如果构建的数组值为空,返回输入的信息,否则用构建的数组的值替换$message中的值然后返回
}
}
配置方法:
public static function configure($object, $properties)
{
foreach ($properties as $name => $value) {
$object->$name = $value;//将对象的属性按键值对的形式配置
}
return $object;
}
返回对象中变量的方法:
public static function getObjectVars($object)
{
return get_object_vars($object);//返回某个对象中的公共属性
}
BaseYii.php结束。
Yii源码阅读笔记(三)的更多相关文章
- Yii源码阅读笔记(一)
今天开始阅读yii2的源码,想深入了解一下yii框架的工作原理,同时学习一下优秀的编码规范和风格.在此记录一下阅读中的小心得. 每个框架都有一个入口文件,首先从入口文件开始,yii2的入口文件位于we ...
- Werkzeug源码阅读笔记(三)
这次主要讲下werkzeug中的Local. 源码在werkzeug/local.py Thread Local 在Python中,状态是保存在对象中.Thread Local是一种特殊的对象,它是对 ...
- Yii源码阅读笔记(三十五)
Container,用于动态地创建.注入依赖单元,映射依赖关系等功能,减少了许多代码量,降低代码耦合程度,提高项目的可维护性. namespace yii\di; use ReflectionClas ...
- Yii源码阅读笔记(三十四)
Instance类, 表示依赖注入容器或服务定位器中对某一个对象的引用 namespace yii\di; use Yii; use yii\base\InvalidConfigException; ...
- Yii源码阅读笔记(三十三)
ServiceLocator,服务定位类,用于yii2中的依赖注入,通过以ID为索引的方式缓存服务或则组件的实例来定位服务或者组件: namespace yii\di; use Yii; use Cl ...
- Yii源码阅读笔记(三十二)
web/Application类的注释,继承base/Application类,针对web应用的一些处理: namespace yii\web; use Yii; use yii\base\Inval ...
- Yii源码阅读笔记(三十一)
Widget类中开始,获取视图对象,获取widget ID,渲染视图,获取路径方法注释: private $_id; /** * Returns the ID of the widget. * 返回插 ...
- Yii源码阅读笔记(三十)
Widget类是所有小部件的基类,开始,结束和渲染小部件内容的方法的注释: namespace yii\base; use Yii; use ReflectionClass; /** * Widget ...
- Yii源码阅读笔记(八)
前面阅读了Yii2的两个基本类Object和Component,了解了Yii的三个重要概念属性.事件.行为,下面开始阅读Event类,Event类是所有事件类的基类: <?php /** * @ ...
随机推荐
- wp8 入门到精通 抓包
抓包工具Fiddler的使用 Fiddler是一款免费且功能强大的数据包抓取软件.它通过代理的方式获取程序http通讯的数据.我们可以利用它来检测网页和服务器的交互情况.下面,我们以http://bl ...
- poj 3468 成段增减
Sample Input 10 5 1 2 3 4 5 6 7 8 9 10 Q 4 4 Q 1 10 Q 2 4 C 3 6 3 Q 2 4 Sample Output 4 55 9 15 #inc ...
- 计数排序算法——时间复杂度O(n+k)
计数排序 计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出.它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于 ...
- c++ queue 顺序队列的实现
#include<iostream> #include<cstdlib> #include<cstdio> using namespace std; const i ...
- jdbc、事务(Transaction)、批处理 回顾
论文写的头疼,回顾一下jdbc,换换脑子 传统的写法: 1.加载驱动类 class.forname("jdbc类的包结构"); 2.获得连接 Connection conn=Dri ...
- 【JUnit 报错】java.lang.IncompatibleClassChangeError
使用Junit 测试spring时候报错: java.lang.IncompatibleClassChangeError: class org.springframework.core.LocalVa ...
- 几种php 删除数组元素方法
几种php教程 删除数组元素方法在很多情况下我们的数组会出现重复情况,那我们删除数组中一些重复的内容怎么办,这些元素我必须保持他唯一,所以就想办法来删除它们,下面利用了遍历查询来删除重复数组元素的几种 ...
- Android 编程下设置 Activity 切换动画
为 Activity 设置切换动画 我们知道,我们可以在 AndroidManifest.xml 文件中,通过 android:theme 属性设置 Activity 的主题.主题中定义了关于 Act ...
- javascript优化--10模式(设计模式)01
单体模式:保证一个特定类仅有一个实例;即第二次使用同一个类创建新对象时,应该得到与第一个所创建对象完全相同对象: 在JS中,可以认为每次在使用对象字面量创建对象的时候,实际上就在创建一个单体: 当使用 ...
- 转-CSS3 圆角(border-radius)
CSS3 圆角(border-radius) 前缀 例1 例2:无边框 书写顺序 其它 支持性 值:半径的长度 前缀 -moz(例如 -moz-border-radius)用于Firefox -w ...