Frage

Ich frage mich, ob ich eine statische Variable für die Optimierung verwenden kann:

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

Ich weiß, dass, sobald $i initialisiert wird, wird es nicht durch auf aufeinanderfolgende Aufrufe Bar() von dieser Zeile Code geändert werden. I übernehmen Dies bedeutet, dass moderatelyExpensiveFunctionCall() wird nicht jedes Mal, wenn ich Anruf ausgewertet werden, aber ich möchte sicher wissen.

Wenn PHP eine statische Variable sieht, die initialisiert wurde, überspringt es, dass die Code-Zeile über? Mit anderen Worten, dies ist meine Ausführungszeit optimieren gehen, wenn ich eine Menge Anrufe zu Bar() machen, oder bin verschwende ich meine Zeit?

War es hilfreich?

Lösung

Ich finde es einfacher unten etwas wie der Code zu tun. Auf diese Weise das Caching global statt pro Implementierung der Funktion durchgeführt wird.

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

Andere Tipps

static $i = blah() wird nicht kompiliert, da PHP erlaubt keine Ausdrücke und Funktionsaufrufe in statischen Initialisierungen. Sie brauchen so etwas wie

function foo() {
   static $cache = null;

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

   do something with $cache
}

Dies sollte in Ihrem (ganz einfach) Fall arbeiten:

function your_function() {
    static $output;

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

    return $output;
}

Wie für einen globalen Cache-Mechanismus, können Sie ein ähnliches Verfahren wie dieses .

Hier ist ganz kürzer Ansatz:

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;
}

Wie wäre:

if (!isset($i))
{
    static $i = moderatelyExpensiveFunctionCall();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top