静态变量,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();