문제

최적화를 위해 정적 변수를 사용할 수 있는지 궁금합니다.

public function Bar() {
    static $i = moderatelyExpensiveFunctionCall();
    if ($i) {
        return something();
    } else {
        return somethingElse();
    }
}

나는 그것을 한 번 알고있다 $i 초기화됩니다. 연속 통화에서 해당 코드 라인에 의해 변경되지 않습니다. Bar(). 나 추정하다 이것은 그것을 의미합니다 moderatelyExpensiveFunctionCall() 전화 할 때마다 평가되지는 않지만 확실하게 알고 싶습니다.

PHP가 초기화 된 정적 변수를 보면 해당 코드 라인을 건너 뛰나요? 다시 말해, 많은 전화를 걸면 이것이 실행 시간을 최적화 할 것입니다. Bar(), 아니면 내 시간을 낭비하고 있습니까?

도움이 되었습니까?

해결책

아래 코드와 같은 작업을 수행하는 것이 더 쉽습니다. 이렇게하면 캐싱은 기능의 구현 별 대신 전 세계적으로 수행됩니다.

function moderatelyExpensiveFunctionCall()
{
   static $output = NULL;
   if( is_null( $output ) ) {
     //set $output
   }
   return $output;
}

다른 팁

static $i = blah() PHP는 정적 초기화기에서 표현식 및 기능 호출을 허용하지 않기 때문에 컴파일하지 않습니다. 당신은 같은 것이 필요합니다

function foo() {
   static $cache = null;

   if(is_null($cache)) $cache = expensive_func();

   do something with $cache
}

이것은 (아주 간단한) 케이스에서 작동해야합니다.

function your_function() {
    static $output;

    if (!isset($output)) {
       $output = 'A very expensive operation';
    }

    return $output;
}

글로벌 캐싱 메커니즘은 다음과 유사한 메소드를 사용할 수 있습니다. 이 하나.

다음은 매우 짧은 접근 방식입니다.

function stuff()
{
    static $smthg = []; // or null, or false, or something else
    if ($smthg) {
        return $smthg;
    }

    // filling $smthg goes here 
    // with a lot of 
    // code strings

    return $smthg;
}

어때요 :

if (!isset($i))
{
    static $i = moderatelyExpensiveFunctionCall();
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top