详解thinkphp的U函数及其源码分析

本文介绍了ThinkPHP 3.23版本中的U函数,包括其四个参数的用途:url用于指定URL表达式,vars用于设置参数值对,suffix控制URL后缀,domain决定是否显示域名。文章通过源码分析,详细解释了U函数的工作流程,并提到了模块、控制器和操作映射等核心概念,辅助以流程图帮助理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近太忙了,好长一段时间没写博客,这段时间总算稍微有点时间了,准备看看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,'@')) { // 解析
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值