2015-12-26 16 views
5

Hallo allerseits und Frohe Weihnachten!Speichern von Daten in einer statischen Klasse [PHP]

Ich habe Probleme mit der Effizienz und ich hoffe, dass die StackOverflow-Community mir helfen kann.

In einer meiner (statischen) Klassen habe ich eine Funktion, die eine große Menge an Informationen aus meiner Datenbank nimmt, analysiert diese Informationen und legt sie in ein formatiertes Array. Viele Funktionen innerhalb dieser Klasse beruhen auf diesem formatierten Array und in der gesamten Klasse rufe ich sie mehrmals auf, was bedeutet, dass die Anwendung diese Prozesse mehrere Male in einem einzigen Durchlauf durchläuft, was ich für nicht sehr effizient halte. Ich frage mich, ob es einen effizienteren Weg gibt, dies zu tun. Gibt es eine Möglichkeit für mich, das formatierte Array in der statischen Funktion zu speichern, so dass ich nicht jedes Mal den gesamten Prozess erneut durchführen muss, wenn ich Informationen aus dem formatierten Array benötige?

private static function makeArray(){ 
    // grab information from database and format array here 
    return $array; 
} 

public static function doSomething(){ 
    $data = self::makeArray(); 
    return $data->stuff; 
} 

public static function doSomethingElse(){ 
    $data = self::makeArray(); 
    return $data->stuff->moreStuff; 
} 
+0

Ist das Ergebnis 'Makearray()' immer das gleiche auf jeder anrufen? Wenn dies der Fall ist, können Sie es in einer statischen Eigenschaft zwischenspeichern und das Ergebnis zurückgeben, wenn es bereits ausgefüllt ist. –

+0

Wenn die Daten in der Datenbank aktualisiert werden (was nicht oft vorkommt und manuell durchgeführt wird), wird das Ergebnis von makeArray() geändert, so dass das Zwischenspeichern eine gute Option darstellt. Wie würden Sie vorschlagen, dass ich so ein Ergebnis cache? – camrymps

Antwort

3

Wenn das Ergebnis der makeArray() nicht während einem Durchlauf des Skripts ändern erwartet, sollten Sie das Caching das Ergebnis davon in einer statischen Klasse Eigenschaft nach dem ersten Mal abgerufen wird. Überprüfen Sie dazu, ob die Variable leer ist. Wenn dies der Fall ist, führen Sie die Datenbankaktion aus und speichern Sie das Ergebnis. Wenn nicht leer, gib einfach das existierende Array zurück.

Sie können der Funktion sogar einen booleschen Parameter hinzufügen, der eine neue Kopie des Arrays erzwingt.

// Add a boolean param (default false) to force fresh data 
private static function makeArray($fresh = false) { 
    // If still empty OR the $fresh param is true, get new data 
    if (empty(self::$array) || $fresh) { 
    // grab information from database and format array here 
    self::$array = array(...); 
    } 
    // Return it - maybe newly populated, maybe cached 
    return self::$array; 
} 

alle anderen Klassenmethoden können weiterhin Aufruf self::makeArray() wie Sie bereits getan haben.

public static function doSomething(){ 
    $data = self::makeArray(); 
    return $data->stuff; 
} 

Wenn Sie den optionalen Parameter frisch und wollen hinzugefügt, um eine Retrieval zu zwingen, aus der Datenbank

public static function doSomething(){ 
    // Call normally (accepting cached values if present) 
    $data = self::makeArray(); 
    return $data->stuff; 
} 
public static function doSomethingRequiringRefresh(){ 
    // Call with the $fresh param true 
    $data = self::makeArray(true); 
    return $data->stuff; 
}