PHP静态变量用法

静态变量,static variable。下面这句话非常重要: 静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。

第一部分 静态变量

一、静态变量和普通变量的区别
0、静态变量只被初始化一次,下一次依据上一次结果值。
1、静态变量存储在静态存储区
一定会存在的而且会永恒存在、不会消失,这样的数据包括常量、常变量(const 变量)、静态变量、全局变量等。
静态 、常量、全局变量就是存放在静态存储区,他们在程序编译完成后就已经分配好了,生命周期持续至程序结束。
进一步解释,查看《Linux内存管理笔记》《动态存储区、静态存储区、堆和栈的区别

二、静态变量赋值的时机

三、静态变量释放的时机
程序退出的时候。

四、静态方法

第二部分 静态变量的用法

具体例子可参考官网。下面给出生产环境的用法:
一、区分项目
在基础目录新增一个Util.php文件

<?php
/**
 * 功能介绍 工具方法
 *
 * @author:   chuanbo7 <salmonl@niliu.me>
 * @date:     2019-04-19
 */

// set app标示
function appFlagSet($flag, $get = false)
{
    static $app_flag = ' ';
    if ($get === true) {
        return $app_flag;
    }
    $app_flag = $flag;
}

// get app标示
function appFlagGet()
{
    return appFlagSet('', true);
}

// the end of the script

用法:
0、在项目入口文件index.php中引入这个文件
1、在项目路由中区分项目,分别调用appFlagSet()写入不同的标示。

$uri = $request->getRequestUri();
if ($uri == 'episode') {
    appFlagSet(EPISODE);
} elseif ($uri == 'variety') {
    appFlagSet(VRRIETY);
}

2、在项目中任何地方调用appFlagGet()获取项目标示。
3、思考:如果是单纯的标示,使用$GLOBALS[‘app_flag’] = EPISODE;也可以达到目的。

二、项目记录Debug和执行时间
0、在基础目录新增一个Util.php文件

<?php
//打时间标记, $flag 为标记名,默认为_default
function flagtime($flag = '_default') {
    static $static_time = array();
    if (!isset($static_time[$flag])) {
        $static_time[$flag] = microtime(true);
    }
    $diff = microtime(true) - $static_time[$flag];
    $static_time[$flag] = microtime(true);

    return substr(($diff * 1000) , 0, 5) . 'ms';
}

//存debug信息
function debugSet($string, $get = false) {
    if (!DEBUG)
    return '';
    static $debug_data = array();
    if ($get === true) {

        return $debug_data;
    }
    if (DEBUG) {
        $d = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1);
        $file = isset($d[0]['file']) ? basename($d[0]['file']) : 'unknown';
        $line = isset($d[0]['line']) ? $d[0]['line'] : 'unknown';
        $debug_data[] = $file . '(line ' . $line . '): ' . $string;
    }
}
//取debug信息
function debugGet() {

    return debugSet('', true);
}

1、在入口和出口分别调用flagtime(),获取项目执行时间。
2、获取请求url执行时间,在请求前后记录

// 请求前
flagtime(1);
// 请求结束
debugSet('{Curl(' . flagtime(1) . ')}' . $url);
// 输出
debugGet();

参考:
手册PHP Static关键词
变量范围维基百科:静态变量

发表评论

电子邮件地址不会被公开。 必填项已用*标注