Bleiben statische Variablen in PHP über die Anfragen hinweg bestehen?
Lesezeit: 3 Minuten
Statische Variable gotcha in php
Ich habe einen Java-Hintergrund und bin kürzlich für ein Projekt zu PHP gewechselt. Ich habe ein unerwartetes Verhalten in PHP gefunden.
Der auf eine statische Variable gesetzte Wert ist nicht bleiben hartnäckig über die Anfragen.
Ich bin mir nicht sicher, ob dies das erwartete Verhalten ist. Denn in Java können Sie sehr häufig verwendete Variablen immer beibehalten oder Konstanten wie dbname,hostname,username,password über die Anfragen sagen, damit Sie sie nicht immer aus lokalen Eigenschaftsdateien lesen müssen.
Ist dieses Verhalten normal? Und wenn es normal ist, gibt es dann eine Alternative, mit der ich Werte, die Variablen zugewiesen sind, über die Anforderungen hinweg beibehalten kann?
Kann mir jemand einen besseren Weg vorschlagen, dies in PHP zu tun?
Roß
Nein, während eine statische Variable für die aktuelle Anfrage erhalten bleibt, müssen Sie sie zu einer Sitzung hinzufügen, um ihren Wert über Anfragen hinweg beizubehalten.
Beispiel:
session_start();
class Car {
public static $make;
public function __construct($make) {
self::$make = $make;
}
}
$c = new Car('Bugatti');
echo '<p>' . Car::$make . '</p>';
unset($c);
if (!isset($_SESSION['make'])) {
echo '<p>' . Car::$make . '</p>';
$c = new Car('Ferrari');
echo '<p>' . Car::$make . '</p>';
}
$_SESSION['make'] = Car::$make;
echo '<p>' . $_SESSION['make'] . '</p>';
Danke Roß. Ich werde die Struktur in XML speichern und zu Beginn der Sitzung lesen und in der Sitzung speichern und bis zum Ende der Sitzung darauf verweisen.
– Vaibhav Kamble
9. Februar 2009 um 7:12 Uhr
Ross, werden die Daten auch über mehrere Anfragen hinweg bestehen bleiben?
– Rahul Patwa
18. Juli 2014 um 17:55 Uhr
@RahulPatwa Wenn Sie die Daten in den Sitzungskontext einfügen, sind sie für diesen Benutzer über Anfragen hinweg zugänglich.
– Roß
22. Juli 2014 um 15:08 Uhr
Statische Variablen gelten nur für eine einzige Anfrage. Wenn Sie möchten, dass Daten zwischen Anfragen für einen bestimmten Benutzer bestehen bleiben, verwenden Sie nur Sitzungsvariablen.
Wenn Sie anfangen, sitzungsübergreifend mit komplexen Datensätzen zu arbeiten, sollten Sie sich überlegen, Daten in Objekten zu speichern, die in die Datenbank serialisiert und bei der Sitzungswiederherstellung herausgezogen werden.
Variablen in PHP sollen nicht persistent sein. Der Fluss Ihrer Anwendung (der Stack) wird bei jedem Seitenlauf von Anfang bis Ende ausgeführt. Es gibt nichts Lebendiges im Hintergrund, das Ihre Logik oder Anwendung fortsetzt. Am nächsten kommt eine Sitzung, aber Sie möchten keine Informationen wie Datenbankzugriff usw. darin speichern.
Ihre Datenbankkonfigurationen sollten sich in einer Art Konfigurations- oder Umgebungsdatei befinden, auf die einmal zugegriffen wird, um eine Verbindung zur Datenbank herzustellen. Sobald eine Verbindung hergestellt wurde, können Sie sie bei Bedarf einfach abfragen und das Verbindungshandle verwenden, um zu ermitteln, welche Verbindung verwendet werden soll.
Die Lösung, die Sie für das Problem angeben, ist der Overhead von IO-Lese-Schreib-Operationen. Es ist genau das Problem, das ich durch die Implementierung dieser Lösung zu überwinden versuchte. Ich denke, schließlich muss ich es in einer Datei speichern und zu Beginn der Sitzung lesen und in der Sitzung speichern. Trotzdem danke 🙂