我们在学习drupal7中,经常在看到函数中调用drupal_static()函数做静态缓存,提高函数的效率。在drupal_static()函数中,用到了PHP的static静态变量知识,这对于在同一个代码文件中,反复调用同一个函数,而函数的结果又可以做缓存处理时,是非常有用的。在drupal7中有如下两个函数:

drupal_static($name,$default_value = NULL,$reset = FALSE);

drupal_static_reset($name = NULL);

drupal7的API代码如下:

https://api.drupal.org/api/drupal/includes%21bootstrap.inc/function/drupal_static/7.x

function&drupal_static($name,$default_value=NULL,$reset=FALSE){static$data=array(),$default=array();//Firstcheckifdealingwithapreviouslydefinestaticvaribaleif(isset($data[$name])||array_key_exists($name,$data)){//不为空$name$data[$name]$default[$name]静态变量也存在if($reset){$data[$name]=$default[$name];}return$data[$name];}//$data[$name]或者$default[$name]都不存在静态变量中if(isset($name)){if($reset){//在默认设置之前调用重置而且必须返回一个变量return$data;}$default[$name]=$data[$name]=$default_value;return$data[$name];}//当$name==NULL重置所有foreach($defaultas$name=>$value){$data[$name]=$value;}//Asthefunctionreturnsareference,thereturnshouldalwaysbeavariablereturn$data;}//drupal_static_reset()的参考代码functiondrupal_static_reset($name=NULL){drupal_static($name,NULL,TRUE);}

针对上面两个函数,测试代码如下:

可做静态缓存案例

functiontest1(){$result=false;$result=&drupal_static(__FUNCTION__);if(!$result){error_log('test1test1test1test1test1');$result='gettest1';}return$result;}$a=test1();echo$a;//gettest1输出error_log日志$b=test1();echo$b;//gettest1但不会有error_log日志

2. 可恢复静态变量初始值测试

functiontest1(){static$result=1;$result=&drupal_static(__FUNCTION__,1);echo$result;$result++;}$a=test1();echo$a;//1$b=test1();echo$b;//2drupal_static_reset('test1');//此处将静态变量又重置为初始值$c=test1();echo$c;//1

以上代码仅供参考,具体使用请参看drupal7官方文档