Wann verwende ich statische Variablen / Funktionen in PHP?

72

Ich aktualisiere mich auf OOP mit PHP und habe ein Beispiel für das Festlegen von Funktionen und / oder Variablen als statisch gesehen. Wann und warum sollte ich eine Variable / Funktion auf statisch setzen? Ich habe andere Sprachen gesprochen und erinnere mich nicht wirklich daran, jemals statisch verwendet zu haben. Ich habe nie einen wirklichen Zweck dafür gefunden. Ich weiß, was es tut, aber warum nicht stattdessen einfach eine Variable verwenden?

Zombat
quelle

Antworten:

55

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();
    // 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");
e-satis
quelle
3
Im Beispiel des vierten Falles verwenden Sie es tatsächlich als eine Art Fabrik, für die ich eine nicht statische Funktion verwenden würde. In diesem Fall wäre der zweite Fall mit dem Singleton und all seinen Cousins ​​mit Instanzsteuerung die einzige tatsächliche Notwendigkeit, statische Funktionen zu verwenden.
fe_lix_
22

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 newOperator instanziiert werden, sodass Sie gezwungen sind, aufzurufen myClass::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?

Tyler Carter
quelle
Was hat =>mit statischen Elementen zu tun?
Andrew Moore
Verdammt ... dachte das wäre->
Tyler Carter
danke, aber da statische Variablen den gleichen Wert haben und nicht wie Variablen flüchtig sind, wie kann ich dann, wenn ich eine Klasse erweitere, die eine statische Variable mit dem Namen etwas enthält, ihren Wert in der erweiterten Klasse ändern? Das gleiche kann mit Variablen gemacht werden. Beide Typen behalten den Wert so lange bei, bis das Objekt zerstört ist.
Sie können die statische Variable ändern. Ich habe nie gesagt, dass sie Konstanten sind. Ich meinte, sie können sich nicht durch den Umfang ändern. Ich werde das klarstellen.
Tyler Carter
Ich verwende php5.2 und habe einen Fehler von diesem Code erhalten. Echo myClass :: myVariable; Es musste $ myVariable für mich sein.
Mark
11

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.

prdatur
quelle
7

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

Aus der Post:

Instanzmethoden sind Instanzmethoden, da sie vom Status der jeweiligen Objektinstanz abhängen. Instanzmethoden sind an eine bestimmte Instanz gebunden, da das von der Methode aufgerufene Verhalten vom Status dieser bestimmten Instanz abhängt.

Wenn Sie eine Methode als statisch deklarieren, definieren Sie diese Methode als Klassenmethode. Eine Klassenmethode gilt für die Klasse im Gegensatz zu einer bestimmten Instanz. Das von einer Klassenmethode ausgelöste Verhalten hängt nicht vom Status einer bestimmten Instanz ab. Tatsächlich kann sich eine statische Methode nicht auf den Status einer Instanz verlassen, da statische Methoden keinen Zugriff auf diese Referenz haben. Stattdessen hängt das Verhalten einer Klassenmethode entweder von einem Status ab, den alle Objekte auf Klassenebene gemeinsam nutzen, oder ist von jedem Status unabhängig.

Wenn sich eine Methode auf den Status einer Objektinstanz stützt, sollte es sich um eine Instanzmethode handeln. Wenn eine Methode für alle oder keine Instanzen einer Klasse allgemein ist und nicht vom Objektstatus abhängt, sollte sie eine statische Methode sein. Instanzmethoden werden am häufigsten verwendet. Statische Methoden sind jedoch für Dienstprogramm- und Factory-Klassen bei vielen anderen Anwendungen sehr nützlich.

Lanze
quelle
3

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.

ujwal dhakal
quelle
1

Statische Elemente weisen eine Reihe von Merkmalen auf, die nützlich sein können.

  1. 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.

  2. 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.

  3. 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.

Dhairya Lakhera
quelle
0

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

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

Hamm
quelle
0

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.

palash140
quelle