Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Vererbung - Construct des Kindes wird nicht aufgerufen

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Vererbung - Construct des Kindes wird nicht aufgerufen

    Hallo zusammen,

    nach langem mitlesen in diesem Forum fange ich jetzt auch mal an selbst was zu schreiben.
    Ist mir fast schon peinlich (da ich wahrscheinlich nur irgend eine Kleinigkeit übersehe), aber ich finde einfach den Fehler nicht. Und zwar schreibe ich z.Zt. an einem eigenen kleinen Framework und baue mir gerade einen ErrorHandler. Da es nur einen ErrorHandler gibt erbt dieser von der Klasse Singleton. Beim Erzeugen der ErrorHandler Instanz sollte eigentlich auch dessen __construct aufgerufen werden, es wird aber nur der __construct des parents (Singleton) aufgerufen (habe ihn nur testweise implementiert, eigentlich hat der Singleton keinen __construct).

    Kann mir jemand verraten wo mein Fehler liegt?

    PHP-Code:
    class dfSingleton
    {
        static protected 
    $_instance null;


        static public function 
    create()
        {
            if (
    self::$_instance === null) {
                
    self::$_instance = new self;
            }
            return 
    self::$_instance;
        }


        public function 
    __construct()
        {
            echo 
    'Singleton __construct<br>';
        }

    PHP-Code:
    class dfErrorHandler extends dfSingleton
    {
        public function 
    __construct()
        {
            echo 
    'error handler construct<br>';
            
    $this->_registerErrorHandler();
        }


        protected function 
    _registerErrorHandler()
        {
            echo 
    'error handler set<br>';
            
    set_error_handler('dfErrorHandler::handle');
        }


        public static function 
    handle($errorNo$errorStr$errorFile$errorLine$errorContext)
        {
            echo 
    'im an error<br>';
        }

    Aufruf über:
    PHP-Code:
    dfErrorHandler::create(); 
    Ausgabe:
    Code:
    Singleton __construct
    Erwartete Ausgabe:
    Code:
    error handler construct
    error handler set
    Normalerweise muss ich doch parent::__construct aufrufen damit das passiert... oder ist das hier irgendwie anders weil ich den __construct aus dem parent heraus aufrufe? Würde mich irgendwie wundern...
    Ich hoffe ich konnte mein Problem verständlich rüber bringen und irgend jemand kennt auch noch die Lösung dafür

    Gruß
    mero


  • #2
    oder ist das hier irgendwie anders weil ich den __construct aus dem parent heraus aufrufe? Würde mich irgendwie wundern...
    Ja, ist es. Das ist die Spezifität von statischen Methoden.

    static verwenden oder gleich ordentliches OOD.
    --

    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


    --

    Kommentar


    • #3
      Lesetipp: http://php.net/manual/de/language.oo...c-bindings.php

      Kommentar


      • #4
        self bezieht sich eben auf die Klasse: http://php.net/manual/en/language.oop5.static.php

        Unabhängig davon würde ich ein Singleton - wenn überhaupt - eher so implementieren: https://github.com/octobercms/librar.../Singleton.php

        Kommentar


        • #5
          Danke für die schnelle Hilfe, zum Laufen bekommen habe ich jetzt erstmal mti der von alxy empfohlenen Methode über
          PHP-Code:
          new static; 
          anstelle von
          PHP-Code:
          new self
          Werde mir jetzt nochmal die beiden nicht ganz kurzen Erklärungen durchlesen

          Dank euch!

          Kommentar


          • #6
            Du solltest dir übrigens den gesamten Trait mal ansehen Bzw auch erwägen, das ganze selber als Trait umzusetzen.

            Kommentar


            • #7
              Hmm das mit den Traits habe ich mir gerade mal angeschaut aber ich glaube da muss ich mal bissl mehr nachlesen. Denn bisher scheint es mir als wenn es nur eine andere Art wäre Methoden von einer Klasse an eine andere weiterzugeben (ähnlich extend und implement) aber irgendwie funktionieren die bissl anders... Wenn ichs richtig verstanden habe werde ich mir nochmal überlegen es zu nutzen *g*
              Danke für den Hinweis.

              Kommentar

              Lädt...
              X