philippo: Klassen und der static-Aufruf

Hallo,

ich habe eine Klasse aus der ich via static-Aufruf

"meineklasse::meinefunktion()"

eine Funktion aufrufe. Das klappt auch wunderbar solange ich innerhalb der "meinefunktion" keine weitere Funktion innerhalb der Klasse aufrufe. Kann ich das irgendwie umgehen, das es trotzdem geht? Wenn ja, hat jemand vorschläge?

Gruß
philippo

  1. Moin!

    ich habe eine Klasse aus der ich via static-Aufruf

    "meineklasse::meinefunktion()"

    eine Funktion aufrufe. Das klappt auch wunderbar solange ich innerhalb der "meinefunktion" keine weitere Funktion innerhalb der Klasse aufrufe. Kann ich das irgendwie umgehen, das es trotzdem geht? Wenn ja, hat jemand vorschläge?

    Üblicherweise ruft man Methoden einer Klasse innerhalb von Methoden ebendieser Klasse über $this->methode() auf, genauso wie man mit $this->variable auf die lokalen Variablen der Klasse zugreifen kann.

    Es könnte allerdings das Problem entstehen, dass du ohne eine instanziierte Klasse beispielsweise keine Klassenvariablen benutzen kannst. Solche Einschränkungen lassen statische Klassenaufrufe eigentlich eher ungewöhnlicher erscheinen in PHP.

    - Sven Rautenberg

    --
    My sssignature, my preciousssss!
    1. Es könnte allerdings das Problem entstehen, dass du ohne eine instanziierte Klasse beispielsweise keine Klassenvariablen benutzen kannst. Solche Einschränkungen lassen statische Klassenaufrufe eigentlich eher ungewöhnlicher erscheinen in PHP.

      das könnte nicht nur so sein, das ist generell immer so. wenn man static-aufrufe nutzt, müssen nalle weiteren genutzen methoden (innerhalb der aufgerufenen methode) auch statisch angesprochen werden.

      grüße Chris

  2. Hallo,

    ich habe eine Klasse aus der ich via static-Aufruf

    "meineklasse::meinefunktion()"

    eine Funktion aufrufe. Das klappt auch wunderbar solange ich innerhalb der "meinefunktion" keine weitere Funktion innerhalb der Klasse aufrufe. Kann ich das irgendwie umgehen, das es trotzdem geht? Wenn ja, hat jemand vorschläge?

    Gruß
    philippo

    was ist mit "keine weitere Funktion innerhalb der Klasse" gemeint?
    innerhalb "meineklasse" ?
    diese kann hier nur statisch aufgerufen werden, da es keine instanz von "meineklasse" gibt.

    umgehen: erst eine instanz von "meineklasse" erzeugen und referenz an "meineklasse::meinefunktion(&$instanz) mitgeben.
    in "meinefunktion" dann $instanz->weiterefunktion() aufrufen.

    aber welchen sinn macht das???

    1. echo $begrüßung;

      umgehen: erst eine instanz von "meineklasse" erzeugen und referenz an "meineklasse::meinefunktion(&$instanz) mitgeben.
      in "meinefunktion" dann $instanz->weiterefunktion() aufrufen.

      aber welchen sinn macht das???

      So'rum ist das sicher nicht sehr sinnvoll. Es gibt aber durchaus Anwendungsfälle für einen statischen Aufruf und anschließende Instanzaufrufe. Beispiel soll hier das singleton-Pattern in PHP5-Code sein.

        
      class myclass {  
        private static $instance;  
        
        public $foo; // irgendeine Eigenschaft  
        
        public static function singleton() {  
          // Instanz erzeugen, wenn noch nicht vorhanden  
          if (is_null(self::$instance)) {  
            self::$instance = new self;  
        
            // ein Beispiel-Aufruf einer nicht-statischen Methode  
            self::$instance->init();  
          }  
          return self::$instance;  
        }  
        
        private function init() {  
          $this->foo = 42;  
        }  
      }  
        
      $object = myclass::singleton();  
      echo $object->foo;  
      $object->foo = 43;  
        
      $object2 = myclass::singleton();  
      echo $object2->foo;  
      
      

      (Was ich im konkreten Fall des OP für angebracht hielte, kann ich natürlich ohne Kenntnis der Aufgabenstellung nicht sagen.)

      echo "$verabschiedung $name";

      1. singleton soll sicherstellen, dass es von einer bestimmten klasse nur eine instanz gibt. diese anforderung ist aus dem posting des fragestellers nicht ersichtlich, und wohl auch nicht gemeint.

        die problematik des fragestellers kann sich durchaus auf unterschiedliche instanzen beziehen (schleife in einer liste).

        ab php5 ist ja eine erweiterung dahingehend vorgenommen, dass zwischen static und instanzaufrufen schon in der deklaration unterschieden wird, und sich diese methoden dann auch nur dementsprechend aufrufen lassen.

        inwieweit singletons mit php5 sinn machen, kann ich nicht weiter kommentieren, da sich mir diese fragestellung bislang nicht im zusammenhang mit php gestellt hat. bei anderen multithread anwendungen ist das ja völlig üblich.

        1. echo $begrüßung;

          singleton soll sicherstellen, dass es von einer bestimmten klasse nur eine instanz gibt. diese anforderung ist aus dem posting des fragestellers nicht ersichtlich, und wohl auch nicht gemeint.

          Es war ja nur ein Beispiel ohne direkten Bezug auf das Problem des OP, weil es nicht bekannt ist.

          ab php5 ist ja eine erweiterung dahingehend vorgenommen, dass zwischen static und instanzaufrufen schon in der deklaration unterschieden wird, und sich diese methoden dann auch nur dementsprechend aufrufen lassen.

          Jein. Auch unter PHP5 lassen sich statische Methoden als Instanz-Methoden aufrufen und umgekehrt. Es gibt dabei nur eine E_STRICT-Notice. E_STRICT ist auch nicht in E_ALL enthalten und muss noch extra hinzugefügt werden, beispielsweise: error_reporting(E_ALL | E_STRICT);

          inwieweit singletons mit php5 sinn machen, kann ich nicht weiter kommentieren, da sich mir diese fragestellung bislang nicht im zusammenhang mit php gestellt hat.

          Beispiel: eine Datenbankklasse. Beim ersten singleton-Aufruf wird sie initialisiert und bei weiteren Aufrufen gibt's die bereits initialisierte Instanz zurück.
          Wobei man auch noch eine statische Query-Methode hinzufügen könnte, die sich ihrerseits mit self::singleton() der Instanz bedienen kann.
          (Ja, es gibt auch Anwendungsfälle, in denen man mehrere Datenbankverbindungen braucht. Dann ist der singleton-Einsatz nur begrenzt bis gar nicht geeignet.)

          echo "$verabschiedung $name";

          1. Jein. Auch unter PHP5 lassen sich statische Methoden als Instanz-Methoden aufrufen und umgekehrt. Es gibt dabei nur eine E_STRICT-Notice. E_STRICT ist auch nicht in E_ALL enthalten und muss noch extra hinzugefügt werden, beispielsweise: error_reporting(E_ALL | E_STRICT);

            aus kompatibilitätsgründen ist das möglich. aber das E_ steht für ERROR.

            Beispiel: eine Datenbankklasse. Beim ersten singleton-Aufruf wird sie initialisiert und bei weiteren Aufrufen gibt's die bereits initialisierte Instanz zurück.
            Wobei man auch noch eine statische Query-Methode hinzufügen könnte, die sich ihrerseits mit self::singleton() der Instanz bedienen kann.
            (Ja, es gibt auch Anwendungsfälle, in denen man mehrere Datenbankverbindungen braucht. Dann ist der singleton-Einsatz nur begrenzt bis gar nicht geeignet.)

            über "datenbankklassen" läßt sich prima diskutieren. die "üblichen" ansätze finde ich müll, da ich andere ansprüche stelle. hier unterscheiden sich die php und java leute sehr stark, da letztere mehr in schichten denken. meinen weg habe ich auf:
             http://fanelf.de/Dokumentation/Persistenz.htm
            mal als unvollständiges beispiel hingestellt.