静态变量,static variable。下面这句话非常重要: 静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。
第一部分 静态变量
一、静态变量和普通变量的区别
0、静态变量只被初始化一次,下一次依据上一次结果值。
1、静态变量存储在静态存储区
一定会存在的而且会永恒存在、不会消失,这样的数据包括常量、常变量(const 变量)、静态变量、全局变量等。
静态 、常量、全局变量就是存放在静态存储区,他们在程序编译完成后就已经分配好了,生命周期持续至程序结束。
进一步解释,查看《Linux内存管理笔记》《动态存储区、静态存储区、堆和栈的区别》
二、静态变量赋值的时机
三、静态变量释放的时机
程序退出的时候。
四、静态方法
第二部分 静态变量的用法
具体例子可参考官网。下面给出生产环境的用法:
一、区分项目
在基础目录新增一个Util.php文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <?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()写入不同的标示。
1 2 3 4 5 6 | $uri = $request ->getRequestUri(); if ( $uri == 'episode' ) { appFlagSet(EPISODE); } elseif ( $uri == 'variety' ) { appFlagSet(VRRIETY); } |
2、在项目中任何地方调用appFlagGet()获取项目标示。
3、思考:如果是单纯的标示,使用$GLOBALS[‘app_flag’] = EPISODE;也可以达到目的。
二、项目记录Debug和执行时间
0、在基础目录新增一个Util.php文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <?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执行时间,在请求前后记录
1 2 3 4 5 6 | // 请求前 flagtime(1); // 请求结束 debugSet( '{Curl(' . flagtime(1) . ')}' . $url ); // 输出 debugGet(); |