首頁 >後端開發 >php教程 >ThinkPHP中U()和redirect()還有success()三個跳轉法有什麼差別? ?

ThinkPHP中U()和redirect()還有success()三個跳轉法有什麼差別? ?

WBOY
WBOY原創
2016-12-01 01:27:471746瀏覽

ThinkPHP中U()和redirect()還有success()三個跳轉法有什麼差別? ?

回覆內容:

ThinkPHP中U()和redirect()還有success()三個跳轉法有什麼差別? ?

u助手函數是產生url,不涉及跳轉功能。
success和redirect的差別就是前者在跳轉模板上有個笑臉圖案,其他沒任何差別。
你可以看看tp的源碼就能找到答案的

U函數用於產生URL。
公共的redirect函數用於重定向URL。
控制器中的redirect方法,也用於重定向URL,可以指定跳轉時間,跳轉文字。
控制器中的success方法,和redirect一樣,但是有個:)的笑臉。
控制器中的error方法,和redirect一樣,但是有個:(的哭臉

如果這裡閱讀不方便,請造訪ThinkPHP中U函數和redirect、success方法的差異。


在此之前我要修正一下你的描述,U這個不叫方法,叫函數。
關於這三者的區別,我們可以看下thinkphp的原始碼。

U函數

<code class="php">/**
 * URL组装 支持不同URL模式
 * @param string $url URL表达式,格式:'[模块/控制器/操作#锚点@域名]?参数1=值1&参数2=值2...'
 * @param string|array $vars 传入的参数,支持数组和字符串
 * @param string|boolean $suffix 伪静态后缀,默认为true表示获取配置值
 * @param boolean $domain 是否显示域名
 * @return string
 */
function U($url = '', $vars = '', $suffix = true, $domain = false)
{
//省略
}</code>

其實他的註解已經說的很清楚了,回傳值是一個string類型,其實回傳的是產生的網址。
他不是一個動作,只是一個輔助函數而已。

success方法

<code class="php">    /**
     * 操作错误跳转的快捷方法
     * @access protected
     * @param string $message 错误信息
     * @param string $jumpUrl 页面跳转地址
     * @param mixed $ajax 是否为Ajax方式 当数字时指定跳转时间
     * @return void
     */
    protected function error($message = '', $jumpUrl = '', $ajax = false)
    {
        $this->dispatchJump($message, 0, $jumpUrl, $ajax);
    }

    /**
     * 操作成功跳转的快捷方法
     * @access protected
     * @param string $message 提示信息
     * @param string $jumpUrl 页面跳转地址
     * @param mixed $ajax 是否为Ajax方式 当数字时指定跳转时间
     * @return void
     */
    protected function success($message = '', $jumpUrl = '', $ajax = false)
    {
        $this->dispatchJump($message, 1, $jumpUrl, $ajax);
    }</code>

這裡可以很明顯的看到,successerror都是封裝的dispatchJump方法,區別是第二個參數。
我們再去dispatchJump看看。

<code class="php"> /**
     * 默认跳转操作 支持错误导向和正确跳转
     * 调用模板显示 默认为public目录下面的success页面
     * 提示页面为可配置 支持模板标签
     * @param string $message 提示信息
     * @param Boolean $status 状态
     * @param string $jumpUrl 页面跳转地址
     * @param mixed $ajax 是否为Ajax方式 当数字时指定跳转时间
     * @access private
     * @return void
     */
    private function dispatchJump($message, $status = 1, $jumpUrl = '', $ajax = false)
    {
        if (true === $ajax || IS_AJAX) {
            // AJAX提交
            $data           = is_array($ajax) ? $ajax : array();
            $data['info']   = $message;
            $data['status'] = $status;
            $data['url']    = $jumpUrl;
            $this->ajaxReturn($data);
        }
        if (is_int($ajax)) {
            $this->assign('waitSecond', $ajax);
        }

        if (!empty($jumpUrl)) {
            $this->assign('jumpUrl', $jumpUrl);
        }

        // 提示标题
        $this->assign('msgTitle', $status ? L('_OPERATION_SUCCESS_') : L('_OPERATION_FAIL_'));
        //如果设置了关闭窗口,则提示完毕后自动关闭窗口
        if ($this->get('closeWin')) {
            $this->assign('jumpUrl', 'javascript:window.close();');
        }

        $this->assign('status', $status); // 状态
        //保证输出不受静态缓存影响
        C('HTML_CACHE_ON', false);
        if ($status) {
            //发送成功信息
            $this->assign('message', $message); // 提示信息
            // 成功操作后默认停留1秒
            if (!isset($this->waitSecond)) {
                $this->assign('waitSecond', '1');
            }

            // 默认操作成功自动返回操作前页面
            if (!isset($this->jumpUrl)) {
                $this->assign("jumpUrl", $_SERVER["HTTP_REFERER"]);
            }

            $this->display(C('TMPL_ACTION_SUCCESS'));
        } else {
            $this->assign('error', $message); // 提示信息
            //发生错误时候默认停留3秒
            if (!isset($this->waitSecond)) {
                $this->assign('waitSecond', '3');
            }

            // 默认发生错误的话自动返回上页
            if (!isset($this->jumpUrl)) {
                $this->assign('jumpUrl', "javascript:history.back(-1);");
            }

            $this->display(C('TMPL_ACTION_ERROR'));
            // 中止执行  避免出错后继续执行
            exit;
        }
    }
</code>

我們看到了,這裡面沒有任何關於跳轉的程式碼,只是裝載了模板,註冊了幾個模板變數並顯示而已。
那麼它是在哪裡跳轉的呢?顯而易見地,是在模板上。我們去預設模板看看:

<code class="js">(function(){
var wait = document.getElementById('wait'),href = document.getElementById('href').href;
var interval = setInterval(function(){
    var time = --wait.innerHTML;
    if(time <= 0) {
        location.href = href;
        clearInterval(interval);
    };
}, 1000);
})();</code>

可以看到,是透過javascriptlocation.href進行的跳躍。即他是客戶端實現的跳轉。

redirect 方法

<code class="php">    /**
     * Action跳转(URL重定向) 支持指定模块和延时跳转
     * @access protected
     * @param string $url 跳转的URL表达式
     * @param array $params 其它URL参数
     * @param integer $delay 延时跳转的时间 单位为秒
     * @param string $msg 跳转提示信息
     * @return void
     */
    protected function redirect($url, $params = array(), $delay = 0, $msg = '')
    {
        $url = U($url, $params);
        redirect($url, $delay, $msg);
    }</code>

我們可以看到,redirect方法先是用U函數取得了位址做參數,傳給了redirect函數。是對這個函數的封裝。
我們再去redirect函數看看。

<code class="php">/**
 * URL重定向
 * @param string $url 重定向的URL地址
 * @param integer $time 重定向的等待时间(秒)
 * @param string $msg 重定向前的提示信息
 * @return void
 */
function redirect($url, $time = 0, $msg = '')
{
    //多行URL地址支持
    $url = str_replace(array("\n", "\r"), '', $url);
    if (empty($msg)) {
        $msg = "系统将在{$time}秒之后自动跳转到{$url}!";
    }

    if (!headers_sent()) {
        // redirect
        if (0 === $time) {
            header('Location: ' . $url);
        } else {
            header("refresh:{$time};url={$url}");
            echo ($msg);
        }
        exit();
    } else {
        $str = "<meta http-equiv='Refresh' content='{$time};URL={$url}'>";
        if (0 != $time) {
            $str .= $msg;
        }

        exit($str);
    }
}</code>

可以看到一個很短的函數,有兩種服務端跳轉方式,分別用於是否已輸出了http頭部的情況。是服務端的跳轉。

總結

U函數只會用來產生一個url,不會執行跳躍。
success方法本身不會跳轉,而是因為預設的模板上有跳轉的javascript程式碼。
redirect方法是呼叫的服務端函數進行的跳躍。

看thinkPHP的官方文件

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn