Optimizasyonu için statik değişken

5 Cevap php

Ben optimizasyonu için bir statik değişkeni kullanabilirsiniz eğer ben merak ediyorum:

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

I $i başlatıldı kez, o Bar() arda çağrılarda kod satırı ile değiştirilebilir olmayacak biliyorum. I assume bu moderatelyExpensiveFunctionCall() Ben buna her zaman değerlendirilecek anlamına gelir, ama ben kesin olarak bilmek istiyorum.

PHP başlatıldı statik değişken görür sonra, bu kod satırı atlamak mı? Diğer bir deyişle, bu ben Bar() çağrıları bir sürü yapmak, ya da benim vakit ediyorsam benim yürütme süresini optimize etmek için gidiyor?

5 Cevap

Ben daha kolay aşağıdaki kodu gibi bir şey yapmak bulabilirsiniz. Bu şekilde önbelleğe alma işlevini yerine uygulanması başına genel olarak yapılır.

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

Bir çözümleme hatası neden olur, çünkü bu hiç değerlendirmeye alınmayacaktır! :)

Php statik initializers ifadeler ve fonksiyon çağrıları izin vermez, çünkü static $i = blah(), derlemek olmaz. Sen gibi bir şey gerekir

function foo() {
   static $cache = null;

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

   do something with $cache
}

Nasıl hakkında:

if (!isset($i))
{
    static $i = moderatelyExpensiveFunctionCall();
}

Bu (oldukça basit) halinde çalışması gerekir:

function your_function() {
    static $output;

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

    return $output;
}

Küresel bir önbelleğe alma mekanizması olarak, this one benzer bir yöntemi kullanabilirsiniz.