drupal 7でdrupal_static関数ソース分析


私たちはdrupal 7を勉強しています.よく関数を見てdrupalを呼び出します.static()関数は静的キャッシュを行い,関数の効率を高める.drupal_static()関数にはPHPのstatic静的変数の知識が用いられており,これは同じコードファイルで同じ関数を繰り返し呼び出し,関数の結果をキャッシュ処理できる場合に非常に有用である.drupal 7には次の2つの関数があります.
  • drupal_static($name,$default_value = NULL,$reset = FALSE);
  • drupal_static_reset($name = NULL);

  • drupal 7の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();
    	//First check if dealing with a previously define static varibale
    	if( 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( $default as $name=>$value ){
    	    $data[$name] = $value;
    	}
        //As the function returns a reference, the return should always be a variable
    	return $data;
    }
    //drupal_static_reset()     
    function drupal_static_reset( $name = NULL ){
        drupal_static($name,NULL,TRUE);
    }

    上記の2つの関数について、テストコードは次のとおりです.
  • 静的キャッシュが可能なケース
  • function test1(){
    	$result = false;
         $result = &drupal_static(__FUNCTION__);
    	 if( !$result ){
    	     error_log( 'test1test1test1test1test1' );
    		 $result = 'get test1';
    	 }
    	 return $result;
    }
    $a = test1();
    echo $a;//get test1   error_log  
    $b = test1();
    echo $b;//get test1     error_log  

    2.静的変数の初期値を回復できるテスト
    function test1(){
    	static $result = 1;
    	$result = &drupal_static(__FUNCTION__,1);
    	 echo $result;
    	 $result++;
    }
    
    $a = test1();
    echo $a;//1
    $b = test1();
    echo $b;//2
    drupal_static_reset('test1');//              
    $c = test1();
    echo $c;//1

    以上のコードは参考までに、drupal 7公式ドキュメントを参照してください.