web-dev-qa-db-de.com

Wann verwende ich statische Variablen/Funktionen in PHP?

Ich erneuere mich auf OOP mit PHP und ich sah ein Beispiel, wie Funktionen und/oder Variablen als statisch festgelegt werden. Wann und warum sollte ich eine Variable/Funktion auf statisch setzen? Ich habe andere Sprachen gemacht und erinnere mich nicht wirklich daran, statisch verwendet zu haben. Ich habe nie einen wirklichen Zweck dafür gefunden. Ich weiß, was es tut, aber warum nicht stattdessen eine Variable verwenden?

70
iaddesign

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 Toolboxes in Sprachen, die nichts anderes als OOP wie Java zulassen, aber in PHP nicht nützlich sind).

  • Sie möchten den Zugriff auf die Instanz steuern. Meistens wird die Instanz, mit der Sie arbeiten möchten, nicht beim Schreiben des Codes definiert, sondern bei der Ausführung. Das Singleton-Muster ist das beste Beispiel. Sie können statische Methoden als Factory verwenden, um ein Objekt entsprechend dem Kontext zu erstellen oder Ressourcen mit anderen Instanzen gemeinsam zu nutzen. E.G: Ein statisches Mitglied kann Zugriff auf eine Datenbankebene gewähren, sodass ein Teil der App von überall auf das gleiche Element zugreift und ohne Konflikte geöffnet/geschlossen wird.

  • Performances spielen eine Rolle und die Methode wird oft ausgeführt. In diesem Fall sparen Sie etwas CPU-Zeit, sodass der Interpreter bei jedem Aufruf das Mitglied nicht zu einer Instanz suchen kann. Wenn jedoch Perfs zu einem solchen Problem werden, dass Sie zu dieser Lösung kommen, wird es möglicherweise Zeit, Ihre Architektur zu überdenken oder die Verwendung einer Bindung für eine schnellere Sprache für die kritischen Teile des Codes.

  • 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, setzt sie jedoch statisch, da sie eine Instanz des anderen erwartet. 

Das perfekte Beispiel ist ein String-Parser:

class MyObject 
{
 static function parse($str)
 {
    $obj = new MyObject();
    // some parsing/setting happens here
    return $obj;
 }
}

// you create an object "MyObject" from a string, so it's more obvious
// to read it this way :
$new_obj = MyObject::parse("This a description of a super cool object");
52
e-satis

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 von überall her darauf zugegriffen werden und ist einer prozeduralen Typfunktion sehr ähnlich, mit der Ausnahme, dass es self verwenden kann und im Klassenbereich enthalten ist.

class myClass{
    static $myVariable = "myVar";
    static function myFunction()
    {
       return "myFunc";
    }
}

Eine der Möglichkeiten, dies zu verwenden, besteht darin, nur eine Instanz einer Klasse oder eine Singleton-Methode zu behalten.

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 er nicht mit dem Operator new instanziiert werden. Sie müssen also myClass::get_connection() aufrufen, um eine Klasse zu erhalten. Diese Funktion kann die neue Klasse erstellen (weil sie ein Mitglied der Klasse ist). Dann wird die Klasse in einer statischen Variablen gespeichert. Wenn Sie die Funktion erneut aufrufen, wird die erstellte Klasse einfach zurückgegeben.

Am Ende wird das statische Schlüsselwort verwendet, um die Dinge in Bezug auf den Gültigkeitsbereich statisch zu halten. Es bedeutet, dass Sie aufgrund des aktuellen Umfangs nichts "ändern" möchten. Während die Singleton-Methode dies etwas ausdehnt, bleibt sie bei der gleichen Vorstellung, dass Sie immer die Klasse "gleiche" haben, unabhängig davon, in welchem ​​Bereich Sie sich befinden.

PHP-Dokumentation
Statisches Schlüsselwort
Scope Resolution Operator

StackOverflow-Wissen
Vermeidung der Verwendung von PHP globalen Objekten
Gemeinsame Verwendung von Variablen zwischen Funktionen in PHP ohne Verwendung von Globalen
Globale Variable für jede Funktion innerhalb einer Klasse zugänglich machen
Global oder Singleton für Datenbankverbindung
PHP Klassen: Wann werden :: vs. -> verwendet?

22
Tyler Carter

Auch für das Caching ist es 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 sehr oft in meinem Framework aufgerufen und dort wird für jeden Aufruf eine Datenbanksuche für meine Konfigurations-$ _SERVER-Taste durchgeführt

Während die Seite verarbeitet wird, rufe ich vielleicht 10 Mal in einer Seite auf, sie hat 10 Datenbankaufrufe, 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;
}

Also einfach nach jeder Seite das normale Verhalten überprüfen, wenn ich mich einlogge und das Ergebnis zwischenspeichern. Beim nächsten Mal wird nur der zwischengespeicherte Wert zurückgegeben. Diese Funktion benutze ich sehr oft, um mehr Leistung zu erzielen.

Hoffe das hilft.

10
prdatur

Hier ist eine zufällige, aber ziemlich gute Beschreibung der Unterschiede zwischen statischen und Instanzmethoden .

Aus der post:

Instanzmethoden sind Instanzmethoden, da sie sich auf den Zustand .__ verlassen. der spezifischen Objektinstanz. Instanzmethoden sind an ein .__ gebunden. bestimmte Instanz, weil das Verhalten, das die Methode aufruft stützt sich auf den Zustand dieser bestimmten Instanz.

Wenn Sie eine Methode als statisch deklarieren, definieren Sie diese Methode als Klassenmethode. Eine Klassenmethode gilt für die Klasse im Gegensatz zu einem beliebigen bestimmte Instanz. Das von einer Klassenmethode initiierte Verhalten tut Verlassen Sie sich nicht auf den Zustand einer bestimmten Instanz. In der Tat eine statische Die Methode kann sich nicht auf den Status einer Instanz verlassen, da statischen Methoden ___ fehlt. Zugriff auf diese Referenz. Stattdessen das Verhalten einer Klassenmethode Entweder hängt es von einem Zustand ab, den alle Objekte auf Klassenebene gemeinsam haben, oder ist überhaupt unabhängig von irgendeinem Staat.

Wenn sich eine Methode auf den Status einer Objektinstanz stützt, sollte es eine .__ sein. Instanzmethoden. Wenn eine Methode allgemein für alle oder keine Instanzen eines .__ ist. Klasse und ist nicht auf den Objektstatus angewiesen, es sollte eine statische .__ sein. Methode. Instanzmethoden werden am häufigsten verwendet. Jedoch statisch Methoden sind sehr nützlich für Utility- und Factory-Klassen unter vielen andere Verwendungen.

7
lance

Im Allgemeinen können Sie mithilfe der statischen Funktion die Geschwindigkeit sowie den Speicher optimieren. Der Umfang der Methode sollte nicht geändert werden. Sie sollte statisch sein und Sie können auf die statischen Eigenschaften des Objekts zugreifen, ohne sie zu initiieren, und sparen so den Speicherplatz.

3
ujwal dhakal

Statische Elemente haben eine Reihe von Eigenschaften, die nützlich sein können. 

  1. Erstens sind sie von überall in Ihrem Skript verfügbar (vorausgesetzt, Sie haben Zugriff auf die Klasse). Das heißt, Sie können auf die Funktionalität zugreifen, ohne eine Instanz der Klasse von Objekt zu Objekt übergeben zu müssen oder, schlimmer noch, eine Instanz in einer globalen Variablen zu speichern. 

  2. Zweitens ist eine statische Eigenschaft für jede Instanz einer Klasse verfügbar. Sie können also Werte festlegen, die für alle Member eines Typs verfügbar sein sollen.

  3. Die Tatsache, dass Sie keine Instanz benötigen, um auf eine statische Eigenschaft oder Methode zuzugreifen, kann Sie davon abhalten, ein Objekt zu instantiieren, um eine einfache Funktion zu erhalten.

1
Dhairya Lakhera

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.

0
palash140

Besuch: http://verraes.net/2014/06/when-to-use-static-methods-in-php/

Statische Methoden sind nichts anderes als globale Funktionen mit Namensraum. Ich denke, wir können uns alle darauf einigen, dass Namespacing großartig ist. Was globale Funktionen angeht: Wir verwenden diese ständig. Die nativen Funktionen in PHP bilden unsere Grundbausteine.

0
Hamm