Ankündigung

Einklappen
Keine Ankündigung bisher.

Selbstzerstörende Klasse

Einklappen

Neue Werbung 2019

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

  • Selbstzerstörende Klasse

    Wie kann ich eine Klasse sich selbst zerstören lassen?

    PHP-Code:
    class foo
        
    {
        function 
    destroy1()
            {
            unset(
    $this);
            } 
    // end function destroy1
        
    function destroy2()
            {
            
    $this null;
            } 
    // end function destroy2
        
    // end class foo 
    Weder unset($this); noch $this = null; zerstören die Klasse. Der Hintergrund ist der, dass ich beim Aufruf einer Klasse (genauer dem Konstruktor der Klasse) etwas überprüfe und wenn die Bedingungen nicht erfüllt sind, dann soll das Objekt nicht verwendbar sein. Ich könnte eine Variable setzen (z.B. $this->disabled = true) und am Anfang jeder Methode überprüfen ob die Variable true ist aber das wäre mir zu umständlich und unsauber.


  • #2
    Du könntest sowas machen:

    PHP-Code:
    <?php

    class Foo
    {
        public static function 
    getNewInstance($param1$param2)
        {
            if (
    $param1 == 'foo' && $param2 == 'bar') {
                return new 
    self($param1$param2);
            } else {
                throw new 
    Exception('Cannot instantiate Foo object.');
            }
        }

        protected function  
    __construct($param1$param2)
        {
            echo 
    'Hello world!';
        }
    }

    #$f = Foo::getNewInstance('a', 'b'); // throws Exception
    $f Foo::getNewInstance('foo''bar');

    Kommentar


    • #3
      Wenn man es über ein Singelton lösen möchte, dann sollte man beachten, dass auch die Methoden _clone, __sleep() und __wakeUp auf protected gesetzt sind, da man andernfalls noch Kopien davon anlegen kann.
      "My software never has bugs, it just develops random features."
      "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

      Kommentar


      • #4
        Das ist keine Singleton, sondern eine Factory was er beschrieben hat.
        Allerdings ist auch diese überflüssig, da man auch direkt im Constructor eine Exeption werfen kann. In diesem Fall bringt die Factory-Methode also keinen Mehrwert.

        Kommentar


        • #5
          da man auch direkt im Constructor eine Exeption werfen kann
          Hups. Guter Punkt, schätze ich.

          Kommentar


          • #6
            Im Konstruktor Exceptions werfen ist aber imho deutlich schlechterer Stil als die Factory. Aber ich denke das ist Geschmackssache .

            Kommentar


            • #7
              In C++ gibt es ein Argument, das dagegen spricht: Exceptions in Konstruktoren . Wie sieht es in PHP aus?
              http://hallophp.de

              Kommentar


              • #8
                Zitat von draco88 Beitrag anzeigen
                Das ist keine Singleton, sondern eine Factory was er beschrieben hat.
                Allerdings ist auch diese überflüssig, da man auch direkt im Constructor eine Exeption werfen kann. In diesem Fall bringt die Factory-Methode also keinen Mehrwert.
                Hmm.. ist der Unterschied nicht der, das, wenn man im Constructor eine Exception wirft, das Objekt nicht korrekt initialisiert wurde (undefinierter Zustand)?

                Wirft man hingegen die Exception aus der Factory Methode heraus, ist zumindest der Status des erzeugten Objekts definiert.

                Bin mir bei PHP nicht sicher, in C++ wäre das jedenfalls so...
                Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                Kommentar


                • #9
                  Im Konstruktor Exceptions werfen ist aber imho deutlich schlechterer Stil als die Factory.
                  sehe ich genauso.


                  edit: im Konstruktor könnte man auch den Destruktor aufrufen, wenn irgendwas nicht gesetzt wäre. Ist aber genauso häßlich.
                  I like cooking my family and my pets.
                  Use commas. Don't be a psycho.
                  Blog - CoverflowJS

                  Kommentar


                  • #10
                    Zitat von draco88 Beitrag anzeigen
                    Das ist keine Singleton, sondern eine Factory was er beschrieben hat.
                    Allerdings ist auch diese überflüssig, da man auch direkt im Constructor eine Exeption werfen kann. In diesem Fall bringt die Factory-Methode also keinen Mehrwert.
                    Doch ist es.
                    In der Factory kriegst du irgendeine klasse zurück.
                    Sowas in der Art.
                    PHP-Code:
                    class Factory
                    {
                        public static function 
                    get($param1 null$param2 = array())
                        {
                            if (
                    in_array($param1, array('Test''MyClass'))) {
                                return new 
                    $param($param2);
                            } else {
                                throw new 
                    Exception();
                            }
                        }

                    Da bei ihm aber drin steht:
                    Zitat von mermshaus Beitrag anzeigen
                    PHP-Code:
                    <?php
                     
                    class Foo
                     
                    {
                         public static function 
                    getNewInstance($param1$param2)
                         {
                             if (
                    $param1 == 'foo' && $param2 == 'bar') {
                                 return new 
                    self($param1$param2);           // nur sich selbst!
                             
                    } else {
                                 throw new 
                    Exception('Cannot instantiate Foo object.');
                             }
                         }

                        protected function  
                    __construct($param1$param2)
                        {
                         ...
                        }
                    }
                    Ist das eindeutig ein Singelton. Da er nur sich selbst über eine Methode initialisieren kann.

                    Zum Thema:
                    Ich würde einfach im Konsturktor eine Exception werfen. Wäre einfacher.
                    und dann ist auch die Variable nicht initialisiert. Wobei das sehr hässlich ist...

                    oder

                    Gib dir einfach im Fehlerfall einfach eine Dummyklasse zurück. Sowas in der Art von InitializationFailed
                    und dann kannste einfach mit:
                    PHP-Code:
                    ...
                    try {
                        
                    $class Foo::getNewInstance($param1$param2);
                        if (
                    $class instanceof InitializationFailed) {
                             throw new 
                    Exception('Error during initialization!');
                        }
                        
                    doSomething();

                    } catch (
                    Exception $e) {
                        
                    doSomethingElse();

                    "My software never has bugs, it just develops random features."
                    "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

                    Kommentar


                    • #11
                      Mich würde mal interessieren, weshalb Exceptions im Konstruktor so schlechter Stil sein sollen? Für jeden Konstruktor, der Parameter akzeptiert, die falsch gesetzt sein können, eine Factory(?)-Methode zu schreiben erscheint mir verrückt. Konstruktoren keine Parameter zu übergeben ist auch nicht wesentlich besser. Ich sehe den Nachteil nicht.

                      Kommentar


                      • #12
                        IMHO sollte man Konstuktoren stets "dumm" halten. Diese sollten nichts machen außer Variablen setzen oder dergleichen.
                        Ich finde Funktionsaufrufe oder ähnlicher Schmodders gehört da einfach nicht rein!
                        "My software never has bugs, it just develops random features."
                        "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

                        Kommentar


                        • #13
                          Wenn eine Exception im Konstruktor geworfen wird bleibt das Objekt in einem undefinierten Zustand, sonst eben nicht. It in C++ aber extremer als für Php, ja.

                          Kommentar


                          • #14
                            http://www.research.att.com/~bs/3rd_safe.pdf (Abschnitt E.3.5.1)

                            Exceptions in Konstruktoren sind generell völlig in Ordnung.

                            PS: Mein Beispiel in #2 ist alles, aber kein Singleton.

                            Kommentar


                            • #15
                              Zitat von Paul.Schramenko Beitrag anzeigen
                              Da bei ihm aber drin steht: [...]
                              Ist das eindeutig ein Singelton.
                              Nein, ist es nicht.

                              Da er nur sich selbst über eine Methode initialisieren kann.
                              Es können immer noch beliebig viele Instanzen des Objektes erzeugt werden, wenn die Parameter stimmen.

                              Lies noch mal nach, was Singleton ist.

                              Kommentar

                              Lädt...
                              X