最近太忙了,好长一段时间没写博客,这段时间总算稍微有点时间了,准备看看thinkphp的源码,已经看了一些,但离看完还差得远,总之先单独记录一下看过的源码,以后的东西在陆续放出。
注:我的看的版本不是最新的thinkphp,是3.23的版本。
基础性的讲解:
U函数有四个参数,如 U($url='',$vars='',$suffix=true,$domain=false):
$url是要解析的url的表达式,格式是[模块/控制器/操作#锚点@域名]?参数1=值1&参数2=值2...],可以定义路由,直接在最前面加上/即可
$vars是url的参数值对,string|array类型,字符串形式格式aaa=1&bbb=2
$suffix是url是否带后缀,这个参数是string|boolean类型,true是带后缀,false则为不带,默认为true,也可以直接填写后缀的,例如.html。
$domain是url是否带域名,true显示域名 $url有@域名部分则显示这部分的域名,如果没有则根据情况获取,false不显示域名,false要起效,url保证没有@域名部分,否则还是会显示@域名部分的域名,因为@域名最后解析会赋值给$domain,这样$domain设置为false就无效了,会变成true
U函数源码,源码解释尽可能详细了,可以配合下面的流程图来理解,这里面还涉及了操作、控制器、模块映射,由于篇幅问题,以后单独拿出来写一篇,下面注释也有解释:
/**
* URL组装 支持不同URL模式
* @param string $url URL表达式,格式:'[模块/控制器/操作#锚点@域名]?参数1=值1&参数2=值2...'
* @param string|array $vars 传入的参数,支持数组和字符串
* @param string|boolean $suffix 伪静态后缀,默认为true表示获取配置值,false或空表示没有后缀,还可以直接填写后缀,例如.html
* @param boolean $domain 是否显示域名
* true显示域名 $url有@域名部分则显示这部分的域名,如果没有则根据情况获取
* false不显示域名,false要起效,url保证没有@域名部分,否则还是会显示@域名部分的域名
* 因为@域名最后解析会赋值给$domain,这样$domain设置为false就无效了,会变成true
* @return string
*/
function U($url='',$vars='',$suffix=true,$domain=false) {
// 解析URL
/*parse_url解析url表达式成数组形式并赋值给$info,根据url表达式会分为path和fragment两部分
path对应模块/控制器/操作,fragment对应#锚点@域名?参数1=值1&参数2=值2...*/
$info = parse_url($url);
/*检查$info['path']是否为空,如果不为空,则将其赋值给$url,如果为空,则将操作名赋值给$url*/
$url = !empty($info['path'])?$info['path']:ACTION_NAME;
/*检查$info['fragment']是否设置了*/
if(isset($info['fragment'])) { // 解析锚点
/*如果设置了,则将其赋值给$anchor*/
$anchor = $info['fragment'];
/*检查$anchor中是否有?,且?不是首字符,注意?后是跟query的字符串,这里跟随的是1个或多个参数对*/
if(false !== strpos($anchor,'?')) { // 解析参数
/*如果有则根据?将$anchor打散成两个单元值的数组,?号前对应的单元值赋值给$anchor,
?后对应的单元值赋值$info['query']*/
list($anchor,$info['query']) = explode('?',$anchor,2);
}
/*检查$anchor里是否存在@,且不是首字符,注意@后是跟域名的字符串*/
if(false !== strpos($anchor,'@')) { // 解析