YII框架的类自动加载机制
2015-09-19 17:40
609 查看
YII之所以能实现快速的自动加载类文件,是因为它通过两种途径来实现。
先看文件 vendor\yiisoft\yii2\BaseYii.php 里面的 autoload 方法
类地图文件:vendor\yiisoft\yii2\classes.php 它会在 vendor\yiisoft\yii2\Yii.php 文件中载入进来。
下面再看,别名方法。
例如,控制器的命名空间必须是 namespace app\controllers; 那么 app 就是一个别名。
这个别名在文件 vendor\yiisoft\yii2\base\Application.php 的 setBasePath 方法中写入的。
先看文件 vendor\yiisoft\yii2\BaseYii.php 里面的 autoload 方法
public static function autoload($className) { if (isset(static::$classMap[$className])) { //先去类地图里面找 $classFile = static::$classMap[$className]; if ($classFile[0] === '@') { $classFile = static::getAlias($classFile); } } elseif (strpos($className, '\\') !== false) { //然后再通过别名计算得到类文件地址 $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?"); } }
类地图文件:vendor\yiisoft\yii2\classes.php 它会在 vendor\yiisoft\yii2\Yii.php 文件中载入进来。
下面再看,别名方法。
public static function getAlias($alias, $throwException = true) { if (strncmp($alias, '@', 1)) { // not an alias return $alias; } $pos = strpos($alias, '/'); $root = $pos === false ? $alias : substr($alias, 0, $pos); if (isset(static::$aliases[$root])) { if (is_string(static::$aliases[$root])) { // 返回别名中的地址与类名拼接后的字符串 return $pos === false ? static::$aliases[$root] : static::$aliases[$root] . substr($alias, $pos); } else { foreach (static::$aliases[$root] as $name => $path) { if (strpos($alias . '/', $name . '/') === 0) { return $path . substr($alias, strlen($name)); } } } } if ($throwException) { throw new InvalidParamException("Invalid path alias: $alias"); } else { return false; } }
例如,控制器的命名空间必须是 namespace app\controllers; 那么 app 就是一个别名。
这个别名在文件 vendor\yiisoft\yii2\base\Application.php 的 setBasePath 方法中写入的。
相关文章推荐
- PHP防止SQL注入的方法(2)
- PHP防止SQL注入的方法(1)
- PHP防止SQL注入自带函数分析
- PHP判断是否为手机客户端
- Scalaz(5)- typeclass:my typeclass scalaz style-demo
- Scalaz(5)- typeclass:my typeclass scalaz style-demo
- php多维数组的去重(针对任意的键值进行去重)--二维数组的唯一--时间复杂度~O(n)
- Thinkphp学习笔记
- thinkphp 数据库设置前缀问题 联合查询
- php 出现 500 Internal Server Error错误问题解决
- PHP 基础
- E9天嵌i.mx6q的nfs和tftp环境搭建
- windows下安装php性能分析工具XHProf
- 解决phpcms 后台更新提交更新目录出现PHP has encountered a Stack overflow错误
- Yii的where方法使用大全
- getAttribute()和getParameter()方法区别
- php设置时区和获取当前时间
- Php防跨站分析
- php获取客户端真实IP 防止代理和作弊
- php获得ip地址