Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] OO-Frage: self::<methode> vs static::<methode>

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] OO-Frage: self::<methode> vs static::<methode>

    [ERLEDIGT]

    Frage an die Fortgeschrittenen:

    Ich konnte trotz intensiven tests und Suchen keinen Unterschied feststellen, ob ich "self::methode" oder "static::methode" im Code nutze, da es ja eine Methode entweder gibt oder eben nicht. Und wenn sie existiert, ist es (dem Aufruf) egal, ob sie geerbt wurde, lokal definiert wurde oder loakl die geerbte Definition "überschrieben" wurde.

    Dies im Unterschied zu self::$var und static::$var, wo es natürlich gravierende Unterschiede und eine ganze Reihe von Möglichkeiten gibt, die mir auch bewußt sind.

    Hab ich was übersehen oder ist "static::methode" schlicht überflüssig/ein Äquivalent?

    [EDIT]
    Sorry, habe mich gerade vergallopiert bei den Tests! Ist doch ein Unterschied, habe ich gerade gemerkt. Habe mich durch Nutzung von Traits selber auf's Kreuz gelegt.

    Natürlich ruft "static::methode" d- wenn vorhanden - die "lokal" bzw. am "nähesten" definierte methode auf, währen "self::methode" versucht, die Methoe aus dem selbem Kontext zu rufen, wie die Methode in der der Aufruf verwendet wird.

    SORRY. Post kann gelöscht werden.
    [/EDIT]
    Ich muss PHP im Kontext Home Automation nutzen (Vorgabe Hersteller und nicht zu ändern). Da kommt es leider ggf. auf ms an. Deshalb manche "seltsame" Frage.


  • #2
    Gelöscht/Verschoben/... wird hier wohl in nächster Zeit nichts mehr

    Kommentar


    • #3
      Hallöchen,

      ich finde das Ganze ist etwas unglücklich formuliert worden. Zunächst einmal nennt sich diese Funktionalität, also die Verwendung des static-Schlüsselworts zur Referenzierung der genutzten Klasse, late static binding. Auch lässt sich der Unterschied von self und static sehr simpel erklären. Mit self wird immer die aktuelle Klasse referenziert, wobei static immer die tatsächlich zur Laufzeit genutzte Klasse referenziert. Genaueres dazu: Späte statische Bindung / late static binding.

      Hier ein Beispiel, welches das Prinzip ganz gut veranschaulicht:
      PHP-Code:
      <?php

      class A{
          public function 
      method(){
              echo 
      'A::method' PHP_EOL;
          }

          public function 
      selfReference(){
              
      self::method();
          }

          public function 
      lateStaticBinding(){
              static::
      method();
          }
      }

      class 
      extends A{
          public function 
      method(){
              echo 
      'B::method' PHP_EOL;
          }
      }

      $a = new A;
      $a->selfReference();        // A::method
      $a->lateStaticBinding();    // A::method

      $b = new B;
      $b->selfReference();        // A::method (!)
      $b->lateStaticBinding();    // B::method (!)
      Viele Grüße,
      lotti

      Kommentar

      Lädt...
      X