Statische Methoden in PHP

Lesezeit: 6 Minuten

Benutzer-Avatar
donRumatta

Warum können Sie in PHP über die Instanz einer Klasse auf statische Methoden zugreifen, aber nicht nur über den Typnamen?

UPDATE: Ich bin .net-Entwickler, arbeite aber auch mit PHP-Entwicklern. Kürzlich habe ich diesen Moment über statische Methoden gefunden, die von der Instanz aufgerufen werden, und kann nicht verstehen, warum es nützlich sein kann.

BEISPIEL:

class Foo
{
    public static Bar()
    {
    }
}

Wir können eine Methode wie diese akzeptieren:

var $foo = new Foo();
$foo.Bar(); // ??????

  • Statische Methoden und Eigenschaften sind anfangs etwas knifflig. Sie müssen sich nur daran erinnern, dass eine statische Methode oder Eigenschaft verwendet werden kann, ohne das Objekt zuerst zu instanziieren.

    – EGHDK

    9. Februar 2012 um 7:12 Uhr

  • Können Sie erklären, was genau Sie mit einem Code-Snippet meinen? Deine Frage ist etwas zweideutig.

    – verzeihen

    9. Februar 2012 um 7:28 Uhr

  • Dies ist nicht PHP-spezifisch. In Python können Sie auch auf Methoden zugreifen, die mit dekoriert sind @staticmethod Dekoratoren aus der Instanz, und der einzige Unterschied besteht darin, dass statische Methoden nicht den Kontext (Objekt) erhalten, in dem sie aufgerufen werden.

    – Tadeck

    9. Februar 2012 um 7:44 Uhr

Benutzer-Avatar
Ibrahim Azhar Armar

Bei PHP

die Klasse wird zum Beispiel mit dem Schlüsselwort new instanziiert;

$MyClass = new MyClass();

und auf die statische Methode oder Eigenschaften kann zugegriffen werden, indem entweder der Bereichsauflösungsoperator oder der Objektreferenzoperator verwendet werden. Wenn zum Beispiel die Klasse MyClass enthält die statische Methode Foo() dann kannst du auf beiden Wegen darauf zugreifen.

$MyClass->Foo();

Oder

MyClass::Foo()

Die einzige Regel ist, dass sich statische Methoden oder Eigenschaften außerhalb des Objektkontexts befinden. Sie können beispielsweise nicht verwenden $this innerhalb einer statischen Methode.

  • Obwohl die Instanz verwendet wird, funktioniert es auch: $class->staticMethod()

    – Dmitri

    9. Februar 2012 um 7:25 Uhr

  • @Ibrahim – Eigentlich ist das falsch. Sie können sowohl von einer Instanz der Klasse als auch von der Klasse selbst auf statische und nicht statische Methoden zugreifen. Das einzige Mal, dass Sie einen Fehler erhalten, ist, wenn Sie eine Methode aufrufen, die auf verweist $this statisch.

    – Sam Dufel

    9. Februar 2012 um 7:29 Uhr


  • Ab PHP 7 ist das statische Aufrufen nicht statischer Methoden veraltet und kann entfernt werden

    – Omen

    16. Januar 2020 um 15:58 Uhr

Benutzer-Avatar
Sagte Afkir

Class Do {
  static public function test() {
      return 0;
  }
}

so verwenden:

echo Do::test();

Warum können Sie in PHP über die Instanz einer Klasse auf statische Methoden zugreifen, aber nicht nur über den Typnamen?

Im Gegensatz zu dem, was Sie wahrscheinlich von .NET gewohnt sind, hat PHP dynamische Typen. In Betracht ziehen:

class Foo
{
  static public function staticMethod() { }
}

class Bar
{
  static public function staticMethod() { }
}

function doSomething($obj)
{
  // What type is $obj? We don't care.
  $obj->staticMethod();
}

doSomething(new Foo());
doSomething(new Bar());

Indem Sie also den Zugriff auf statische Methoden über die Objektinstanz zulassen, können Sie einfacher eine statische Funktion mit demselben Namen über verschiedene Typen hinweg aufrufen.

Jetzt weiß ich nicht, ob es einen guten Grund gibt, über auf die statische Methode zuzugreifen -> ist erlaubt. PHP (5.3?) unterstützt auch:

$obj::staticMethod();

was vielleicht weniger verwirrend ist. Beim Benutzen ::muss es eine statische Funktion sein, um Warnungen zu vermeiden (im Gegensatz zu ->was beides zulässt).

  • Vielleicht sollten in Ihrem Beispiel nicht statische Methoden mit einer Schnittstelle verwendet werden, da die Verwendung statischer Methoden etwas verwirrend ist, oder?

    – donRumatta

    9. Februar 2012 um 10:21 Uhr

  • @donRumatta, ich würde nicht behaupten, dass das obige ein guter Code ist. Aber aufgrund der dynamischen Eigenschaften von PHP sind Schnittstellen nicht unbedingt notwendig, und viele Leute programmieren ohne sie. Beachten Sie, dass PHP nicht immer eine gute OOP-Unterstützung hatte, daher sind einige der Antworten auf das „Warum“ nur „schlechte Designentscheidungen früherer Versionen“.

    – Matthew

    9. Februar 2012 um 16:26 Uhr

  • Die Verwendung von -> für Statik ist in PHP 7 veraltet.

    – Samuel Aslund

    5. September 2018 um 15:08 Uhr

  • @SamuelÅslund Ich denke, du hast das rückwärts, es benutzt :: zum Aufrufen von Nicht-Statiken, die veraltet sind: php.net/manual/en/language.oop5.static.php

    – Omen

    16. Januar 2020 um 15:56 Uhr

  • @omn Auf statische Eigenschaften kann nicht über das Objekt mit dem Pfeiloperator -> zugegriffen werden – aus hier.

    – Hashim Aziz

    17. Januar 2021 um 0:17 Uhr


In PHP dürfen Sie zwar auf die statische Methode zugreifen, indem Sie auf eine Instanz der Klasse verweisen, aber Sie müssen dies nicht unbedingt tun. Hier ist zum Beispiel eine Klasse mit einer statischen Funktion:

class MyClass{
    public static function  MyFunction($param){
        $mynumber=param*2;
        return $mynumber;
}

Sie können auf die statische Methode nur über den Typnamen wie folgt zugreifen, aber in diesem Fall müssen Sie den doppelten Doppelpunkt (::) anstelle von “->” verwenden.

$result= MyClass::MyFunction(2);

(Bitte beachten Sie, dass Sie auch über eine Instanz der Klasse mit “–>” auf die statische Methode zugreifen können). Für mehr Informationen: http://php.net/manual/en/language.oop5.static.php

In PHP 7 scheint es absolut notwendig zu sein, dass Sie dazu in der Lage sind $this->staticFunction(). Denn wenn dieser Code innerhalb einer abstrakten Klasse geschrieben wird und staticFunction() ist auch abstrakt in Ihrer abstrakten Klasse, $this-> und self:: unterschiedliche Ergebnisse liefern!

Beim Ausführen $this->staticFunction() von einem (nicht-abstrakten) Kind der abstrakten Klasse landen Sie in child::staticFunction(). Alles ist gut.

Allerdings ausführen self::staticFunction() von einem (nicht-abstrakten) Kind der abstrakten Klasse landen Sie in parent::staticFunction()die abstrakt ist und daher eine Ausnahme auslöst.

Ich denke, das ist nur ein weiteres Beispiel für schlecht gestaltetes PHP. Oder ich brauche mehr Kaffee…

  • Ich denke, dies ist nur ein weiteres Beispiel für schlecht ausgebildete Entwickler. RTFM mit $this beim Zugriff auf statische Methoden ist NIEMALS eine gute Idee oder erforderlich. Wenn Sie die Dokumentation lesen würden, wüssten Sie, dass Sie in diesem Fall (unter anderem) zwischen Eltern- und Kindklasse wählen können, indem Sie entweder “self::” oder “static::” verwenden, siehe php.net/manual/en/language.oop5.late-static-bindings.php Daher ist die Vererbung auf statische Methoden vielleicht doch nicht die beste Strategie.

    – Flip Vernooij

    23. März 2019 um 18:03 Uhr


Benutzer-Avatar
Ehsan

Manchmal ist es nützlich, wenn wir auf Methoden und Eigenschaften im Kontext einer Klasse statt eines Objekts zugreifen können. Dazu können Sie das statische Schlüsselwort verwenden. So können wir auf die statische Methode zugreifen, indem wir den Klassennamen zusammen mit der Bereichsauflösung verwenden.

class User
{
    public static $name="john";

    public static function display()
    {
        return self::$name;
    }
}

echo User::display();

Schauen Sie hier, wir haben eine statische Methode in unserer User-Klasse deklariert. Wenn wir also eine statische Methode deklarieren, können wir darauf zugreifen, indem wir nur den Klassennamen verwenden. Es ist nicht erforderlich, ein Objekt zu erstellen, um dort zuzugreifen. Ich hoffe , Sie werden das ganze Verfahren verstehen .

Hinweis: Dies ist eigentlich der Hauptunterschied zu einer normalen Methode: $this ist bei solchen Methoden nicht verfügbar.

Lesen Sie hier den ganzen Artikel Wie verwendet man statische Eigenschaften in PHP?

  • Ich denke, dies ist nur ein weiteres Beispiel für schlecht ausgebildete Entwickler. RTFM mit $this beim Zugriff auf statische Methoden ist NIEMALS eine gute Idee oder erforderlich. Wenn Sie die Dokumentation lesen würden, wüssten Sie, dass Sie in diesem Fall (unter anderem) zwischen Eltern- und Kindklasse wählen können, indem Sie entweder “self::” oder “static::” verwenden, siehe php.net/manual/en/language.oop5.late-static-bindings.php Daher ist die Vererbung auf statische Methoden vielleicht doch nicht die beste Strategie.

    – Flip Vernooij

    23. März 2019 um 18:03 Uhr


1092330cookie-checkStatische Methoden in PHP

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy