13 Stimmen

Was bringt es, statische Funktionen in PHP zu deklarieren?

In PHP können Sie also Folgendes haben

Class A{
   function B(){}
}

und Sie können sie wie eine statische Funktion aufrufen:

A::B();

Meine Frage ist... wenn ich dies tun kann, dann warum sollte ich jemals die Funktion B() als statisch deklarieren, da dies $this nicht verfügbar macht, so gibt es weniger Flexibilität, so dass Sie alles zu verlieren, aber nichts zu gewinnen haben...

oder gibt es einen Vorteil, die Funktion als statisch zu deklarieren, der mir nicht bekannt ist?

auch ich hörte, dass "statische Aufruf von nicht statischen Methoden" sind "veraltet"....was bedeutet das genau, vor allem in Bezug auf dieses Szenario? ist Aufruf A::B() wenn B() nicht als statisch deklariert ist, etwas, das ich nicht tun sollte? Wenn ja, warum ist das der Fall?

11voto

Pelshoff Punkte 1434

Weil PHP dazu neigt, ein bisschen zu locker mit der Striktheit umzugehen (?), funktionieren diese Dinge. Die Tatsache, dass sie veraltet sind, bedeutet, dass irgendwann in einer zukünftigen Version, es wahrscheinlich ist no mehr zu arbeiten. Wenn Sie also eine nicht-statische Funktion in einem statischen Kontext aufrufen, kann Ihr Programm bei einem zukünftigen PHP-Upgrade kaputt gehen.

Der Vorteil der Deklaration einer Funktion als statisch liegt darin, dass Sie genau dort entscheiden, wie diese Funktion verwendet werden soll. Wenn Sie beabsichtigen, eine Funktion in einem statischen Kontext zu verwenden, können Sie $this sowieso nicht verwenden, also sind Sie besser dran, wenn Sie einfach klar sagen, was Sie vorhaben. Wenn Sie die Funktion statisch verwenden wollen, machen Sie sie statisch. Wenn nicht, dann lassen Sie es. Wenn Sie eine Funktion sowohl statisch als auch nicht statisch verwenden wollen, dann überprüfen Sie bitte Ihre Anforderungen noch einmal :P

1voto

corretge Punkte 1713

Für den Kompatibilitätsmodus. Der statische Aufruf nicht-statischer Methoden erzeugt jetzt eine Warnung der Stufe E_STRICT.

Warum statisch und nicht das Objekt instanziieren? Jeder Programmierer wird Ihnen einen Grund nennen. Ich bevorzuge insbesondere die Instanziierung von Objekten gegenüber statischen Methoden. Es ist klar, nachvollziehbar und wiederverwendbar.

Ich habe einen Prüfstand und der Unterschied war minimal zwischen instanziieren und rufen Sie eine Methode als rufen Sie es staticaly.

Tipp: Wenn Sie vorhaben, Methoden aufzurufen, definieren Sie diese auch statisch;-)

1voto

Quasdunk Punkte 14544

Erstens könnte man so etwas wie in deinem Beitrag in einer streng typisierten Sprache wie Java nicht machen. Java-Code lässt sich nicht kompilieren, wenn man nicht-statische Dinge in einem statischen Kontext aufruft. PHP ist in diesen Dingen (noch) nicht so streng, aber man sollte trotzdem nicht alles machen, nur weil man es kann, auch wenn es eine schlechte Praxis ist und in manchen Sprachen sogar eine "falsche" Praxis.

Die Verwendung statischer Methoden hat durchaus Vorteile. Und es ist nicht ganz richtig, dass man nichts gewinnt oder sogar an Flexibilität verliert. Lassen Sie uns ein Beispiel nehmen:

class A {

  private static $prop_a = 'property_a';

  public static function b() {
    echo 'called b()';
    echo self::$prop_a;

    $A = new A();
    $A->c();
  }

  public function c() {
    echo 'called c()';
  }
}

Jetzt können wir die Klasse auf diese Weise aufrufen:

A::b();

die Folgendes ausgibt

  • angerufen_b
  • eigentum_a
  • genannt_c

Aber Sie können das Gleiche mit tun:

$a = new A();
$a->b();
$a->c();

c() wird jetzt zweimal ausgeführt, aber Sie verstehen die Idee. Innerhalb Ihrer Klasse können Sie die Klasse selbst instanziieren und mit ihr wie mit einem normalen Objekt arbeiten. Aber von außen betrachtet ist es nur eine Zeile Code, während es bei der nicht-statischen Methode 3 Zeilen sind. Ziemlich cool, nicht wahr?

Und wie Sie sehen, können Sie die statische Funktion in einem nicht-statischen Kontext verwenden, d.h. Sie können Ihre Methode als statisch deklarieren, aber wenn Sie Ihre Klasse instanziieren, können Sie sie einfach wie eine normale Methode aufrufen. Klingt ziemlich flexibel für mich ;)

Und nein, Sie können nicht $this in einem statischen Kontext, aber das ist es, was self ist für ;)

-3voto

solidau Punkte 3996

Wenn es sich um eine statische Funktion handelt, müssen Sie die Klasse nicht instanziieren, um die Methode verwenden zu können.

Class A {
  static function hello($arg)
  {
    echo 'Hello, ' . $arg;
  }
}

A::hello('world');

VS

Class A {
  public function hello($arg)
  {
    echo 'Hello, ' . $arg;
  }
}

$a = new A;
$a->hello('world');

Das Wichtigste ist hier die Instanziierung des Objekts. Nachdem Sie ein Objekt instanziiert haben, kann es manipuliert werden, und der Aufruf Ihrer Methoden kann zu unerwarteten Ergebnissen führen. Wenn Ihre Werte und Funktionen statisch in der Klasse deklariert sind, können sie zum Zeitpunkt des Funktionsaufrufs nicht geändert werden.

Das heißt aber nicht, dass Sie immer statische Methoden verwenden sollten, wie das folgende Beispiel zeigt.

class My_math {
  static function pi()
  { 
   return 3.14
  }
}

class My_bakery {
  private var $pie;  

  function set_pie($pie)
  {
    $this->pie = $pie;
  }
  function pie()
  {
    echo "I made you a " . $this->pie . "pie";
  }
}

Ich habe dafür gesorgt, dass My_Math einen konstanten Wert zurückgibt, weil ich weiß, dass sich Pi nicht ändert. Aber in My_bakery möchte ich an manchen Tagen einen Blaubeerkuchen und an anderen Tagen einen Pfirsichkuchen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X