Sie verwenden static, wenn Sie eine Methode / Variable verwenden möchten, die nicht an eine Instanz gebunden ist. Das kann passieren, wenn:
Es gibt keine Beziehung zu Ihrem Zweck und einer Instanz (nützlich für Toolboxen in Sprachen, die nichts anderes zulassen, als OOP wie Java, aber nicht nützlich in PHP).
Sie möchten den Zugriff auf die Instanz steuern. In den meisten Fällen wird die Instanz, mit der Sie sich befassen möchten, beim Schreiben des Codes nicht definiert, sondern wird ausgeführt. Das Singleton-Muster ist das beste Beispiel. Sie können statische Methoden als Fabriken verwenden, um ein Objekt entsprechend dem Kontext zu erstellen oder Ressourcen für andere Instanzen freizugeben. EG: Ein statisches Mitglied kann Zugriff auf eine Datenbankebene gewähren, sodass ein Teil der App von überall auf dieselbe zugreift und ohne Konflikte geöffnet / geschlossen wird.
Performances sind wichtig und die Methode wird oft ausgeführt. In diesem Fall sparen Sie CPU-Zeit und verhindern, dass der Interpreter bei jedem Aufruf das Mitglied zu einer Instanz aufruft. Wenn Perfs jedoch zu einem solchen Problem wird, dass Sie zu dieser Lösung kommen, ist es möglicherweise an der Zeit, Ihre Architektur oder die Verwendung einer Bindung an eine schnellere Sprache für die kritischen Teile des Codes zu überdenken.
Sie haben eine Methode, die sich auf einen Typ bezieht, aber auf einen anderen angewendet wird. Es kann sinnvoll sein, die Methode in die Deklaration des ersten Typs zu schreiben, sie jedoch statisch zu setzen, da sie eine Instanz des anderen erwartet.
Das perfekte Beispiel ist ein String-Parser:
class MyObject
{
static function parse($str)
{
$obj = new MyObject();
return $obj;
}
}
$new_obj = MyObject::parse("This a description of a super cool object");
Statische Funktionen und Variablen werden verwendet, um auf Variablen / Funktionen in einem globalen Bereich wie folgt zuzugreifen:
echo myClass::myVariable; echo myClass::myFunction();
Wenn etwas statisch ist, kann überall darauf zugegriffen werden, und es ist einer Funktion vom Typ Prozedur sehr ähnlich, außer dass es self verwenden kann und im Klassenbereich enthalten ist.
class myClass{ static $myVariable = "myVar"; static function myFunction() { return "myFunc"; } }
Eine Möglichkeit, dies zu verwenden, besteht darin, nur eine Instanz einer Klasse oder eine Singleton-Methode beizubehalten.
class myClass { static $class = false; static function get_connection() { if(self::$class == false) { self::$class = new myClass; } else { return self::$class; } } private function __construct() { // my constructor } // Then create regular class functions. }
Da es einen privaten Konstruktor hat, kann es nicht mit dem
new
Operator instanziiert werden, sodass Sie gezwungen sind, aufzurufenmyClass::get_connection()
, um eine Klasse abzurufen. Diese Funktion kann die neue Klasse erstellen (da sie Mitglied der Klasse ist). Anschließend wird die Klasse in einer statischen Variablen gespeichert. Wenn Sie die Funktion erneut aufrufen, wird einfach die erstellte Klasse zurückgegeben.Am Ende wird das statische Schlüsselwort verwendet, um die Dinge in Bezug auf den Bereich statisch zu halten. Dies bedeutet, dass Sie aufgrund des aktuellen Bereichs keine Änderungen vornehmen möchten. Während die Singleton-Methode dies ein wenig ausdehnt, bleibt sie bei der gleichen Idee, dass Sie immer die gleiche Klasse haben, unabhängig davon, in welchem Bereich Sie sich befinden.
Operator für die Auflösung
statischer Schlüsselwörter in der PHP-Dokumentation
StackOverflow-Wissen
Vermeiden der Verwendung von globalen PHP-Objekten
Teilen von Variablen zwischen Funktionen in PHP ohne Verwendung von Globals Ermöglichen des
Zugriffs auf eine globale Variable für jede Funktion innerhalb einer Klasse
Global oder Singleton für Datenbankverbindungs-
PHP-Klassen: Wann wird :: vs. -> verwendet?
quelle
=>
mit statischen Elementen zu tun?->
Außerdem ist es für das Caching sehr nützlich, wenn eine Methode sehr oft aufgerufen wird und genau dasselbe tut, zum Beispiel:
/** * Returns true if the user is logged in through shibboleth * * @return boolean true on success, else false */ protected function is_logged_in() { //Check shibboleth headers if (!empty($_SERVER['HTTP_SHIB_IDENTITY_PROVIDER']) || !empty($_SERVER['Shib-Identity-Provider'])) { if (!empty($_SERVER[$this->core->dbconfig("shib_auth", self::SHIB_AUTH_CONFIG_UID)])) { return true; } } return false; }
Diese Methode wird in meinem Framework sehr oft aufgerufen und führt dort bei jedem Aufruf eine Datenbanksuche für meinen Konfigurationsschlüssel $ _SERVER durch
Während die Seite verarbeitet wird, rufe ich vielleicht 10 Mal beim Laden einer Seite auf. Es werden 10 Datenbankaufrufe ausgeführt, aber ich habe sie geändert in:
/** * Returns true if the user is logged in through shibboleth * * @return boolean true on success, else false */ protected function is_logged_in() { static $logged_in = null; if($logged_in != null) { return $logged_in; } //Check shibboleth headers if (!empty($_SERVER['HTTP_SHIB_IDENTITY_PROVIDER']) || !empty($_SERVER['Shib-Identity-Provider'])) { if (!empty($_SERVER[$this->core->dbconfig("shib_auth", self::SHIB_AUTH_CONFIG_UID)])) { $logged_in = true; return true; } } $logged_in = false; return false; }
Es wird also für jedes Laden einer Seite einmal das normale Verhalten überprüft, wenn ich mich angemeldet und das Ergebnis zwischengespeichert habe. Beim nächsten Mal wird nur der zwischengespeicherte Wert zurückgegeben. Diese Funktion verwende ich sehr oft, um mehr Leistung zu erzielen.
Hoffe das hilft.
quelle
Hier ist eine zufällige, wenn auch ziemlich gute Beschreibung der Unterschiede zwischen statischen und Instanzmethoden .
Aus der Post:
quelle
Im Allgemeinen können Sie mit der statischen Funktion sowohl die Geschwindigkeit als auch den Speicher optimieren. Der Umfang der Methode sollte nicht geändert werden. Sie sollte statischer Natur sein und Sie können auf die statischen Eigenschaften des Objekts und Methoden zugreifen, ohne sie zu initiieren, wodurch der Speicher in der Zwischenzeit gespart wird.
quelle
Statische Elemente weisen eine Reihe von Merkmalen auf, die nützlich sein können.
Erstens sind sie von überall in Ihrem Skript verfügbar (vorausgesetzt, Sie haben Zugriff auf die Klasse). Dies bedeutet, dass Sie auf Funktionen zugreifen können, ohne eine Instanz der Klasse von Objekt zu Objekt übergeben oder, schlimmer noch, eine Instanz in einer globalen Variablen speichern zu müssen.
Zweitens steht jeder Instanz einer Klasse eine statische Eigenschaft zur Verfügung, sodass Sie Werte festlegen können, die allen Mitgliedern eines Typs zur Verfügung stehen sollen.
Schließlich kann die Tatsache, dass Sie keine Instanz benötigen, um auf eine statische Eigenschaft oder Methode zuzugreifen, Sie davon abhalten, ein Objekt nur zu instanziieren, um zu einer einfachen Funktion zu gelangen.
quelle
Besuchen Sie: http://verraes.net/2014/06/when-to-use-static-methods-in-php/
quelle
Wenn Sie Daten für alle Instanzen freigeben möchten, z. B. Zähler für die Anzahl der Instanzen, die bei der aktuellen Ausführung erstellt wurden.
quelle