PHP停止函数从被覆盖返回

时间:2017-09-13 21:55:04

标签: php

我创建了两个函数:

function script_start_time()
{
    $start_time = microtime(TRUE);
    return $start_time;
}

function script_end_time()
{   $start = script_start_time();
    $end_time = microtime(TRUE);
    $time_taken = $end_time - $start;
    $time_taken = round($time_taken, 4);
    echo 'Page generated in '.$time_taken.' seconds.';
}

function script_start_time()header.php 称为 function script_end_time 称为 in footer.php

我尝试在[{1}}中使用$start_time值,而不使用function script_end_timeglobal。目前我在回声中得到0,我知道这是不正确的。

这些功能在哪里出错,因为似乎static覆盖$start,而不是保留function script_end_time的值。

3 个答案:

答案 0 :(得分:3)

问题是您的script_start_time函数从不保存 $start_time的值,而是在调用函数时始终覆盖它。因此,无论何时调用该函数,您都可以有效地询问当前时间。

如果您稍微调整一下代码,那么它应该按预期工作:

function script_start_time()
{
    // SAVE the value of $start_time the first time it is requested
    static $start_time;
    if (empty($start_time))
    {
        $start_time = microtime(TRUE);
    }
    return $start_time;
}

function script_end_time()
{   
    $start = script_start_time();
    $end_time = microtime(TRUE);
    $time_taken = $end_time - $start;
    $time_taken = round($time_taken, 4);
    echo 'Page generated in '.$time_taken.' seconds.';
}

script_start_time();

usleep(5000);

script_end_time(); // Page generated in 0.0052 seconds.

示例:https://eval.in/861112

答案 1 :(得分:2)

function script_start_time()
{
    return microtime(TRUE);
}

function script_end_time($start_time)
{   
    $end_time = microtime(TRUE);
    $time_taken = $end_time - $start_time;
    $time_taken = round($time_taken, 4);
    echo 'Page generated in '.$time_taken.' seconds.';
}

$start_time = script_start_time();

usleep(4000);

script_end_time($start_time);

答案 2 :(得分:1)

您可以使用类:

,而不是使用相同的函数来保存开始时间并检索它
class Timer {
    private static $start_time;

    public static function start() {
        self::$start_time = microtime(TRUE);
    }

    public static function show_time_since_start() {
        $end_time = microtime(TRUE);
        $time_taken = $end_time - self::$start_time;
        $time_taken = round($time_taken, 4);
        echo 'Page generated in '.$time_taken.' seconds.';
    }
}

然后在脚本的开头打电话:

Timer::start();

最后你做了:

Timer::show_time_since_start();

实际上,我不会将echo语句放在函数中。我只会创建一个返回$time_taken的函数,并在调用者中进行打印。

而不是只有一个计时器,你可以更改类,因此$start_time是一个对象属性而不是类属性,然后你可以创建多个计时器,每个计时器记住不同的开始时间。