Fatal error: Cannot instantiate abstract class

nchristoph

Erfahrenes Mitglied
Hallo zusammen,

ich versuche gerade ein paar Beispiele aus meinem Kursbuch nachzubasteln und komme irgendwie nicht weiter.

Und zwar bin ich bei dem Kapitel mit Abstract Klassen angelangt und versuche, aus der abstract class ein Singleton zu machen.

Folgender Code verursacht diese Fehlermeldung:
Fatal error: Cannot instantiate abstract class

PHP:
abstract class Testabstrakt{
    
    public static $instance;
    public $db_conn = "";
    
    
    public function __construct() {
        if($this->db_conn = null){
            $this->db_conn = DB::getInstance();
        }

    }
   
    public static function getInstance(){      
        if(!isset(self::$instance)){    
            self::$instance = new Testabstrakt();
        }
        return self::$instance;
    }

    public function EchoTest(){
        echo "test";
    }

}

So Rufe ich den Code auf:

PHP:
Testabstrakt::getInstance()->EchoTest()

Zur Fehlermeldung habe ich schon gegooglet und jede gefundene Lösung ausprobiert, leider ohne Erfolg. Leider ist das Buch ein Instituteigenes Buch und mein Kurs ist schon ne Weile vorbei. Also habe ich auch keine möglichkeit, den Trainer zu fragen.

Kann mir eventuell irgendwer nen Tip geben?
 
getInstance() erstellt eine neue Instanz der Klasse Testabstrakt. Das funktioniert aber nicht, da man keine Objektinstanzen von abstrakten Klassen erstellen kann.

Entferne das abstract-Schlüsselwort am Anfang der Klasse. Du hast ja eh keine abstrakten Methoden innerhalb der Klasse (--> deswegen - zumindest hier - sinnlos).
 
Eine vollständige Methode hat normalerweise Dinge wie Namen, Parameter/Returnwert,
und den Code der ausgeführt werden soll.
Wenn eine Methode keinen Code hat ist es nichts, was man aufrufen kann
(klar, was soll denn dann gemacht werden)?

Eine Klasse hat Variablen und vollständige Methoden,
von der Klasse kann man Instanzen erstellen und deren Methoden aufrufen.
Hat man ein Objekt einer Klasse sind davon alle Methoden aufrufbar,
ohne dass der Compiler etc. noch irgendwas in die Richtung weiter prüft.

Wenn man jetzt eine Klasse hat, die unvollständige codelose Methoden hat?
Würde man von der Objekte erstellen könnte man etwas aufrufen, dass es nicht gibt.
Normalerweise würde so eine Klasse selbst gar nicht kompilieren.
Mit "abstract" sagt man dem Compiler, dass das in Ordnung und so gewollt ist.
->Im Gegenzug kann man keine Objekte der Klasse anlegen.

Also nein, von abstrakten Klassen kann man
weder ganz normal noch per Singleton usw. irgendwelche Objekte bekommen.

Wie ComFreek aber schon schriebt hat deine Klasse ja gar keine Methoden ohne Code.
Du könntest das "abstract" einfach wegnehmen, ohne dass die Klasse unkompilierbar wird.


Wozu abstrakte Klassen überhaupt gut sind:
Hauptsächlich als Ausgangspunkt, um davon weitere Klassen erben zu lassen.
Wenn die Kinder volle Klassen sein wollen müssen sie alle Mehoden,
die codelos im Vater stehen, selbst in sich mit Code haben.
Zusammen mit dem codehaltigen Teil vom Vater ergänzt hat dann jede Methode ihren Code.
 
Also könnte ich rein theoretisch mittels abstract einen Pluginloader machen und z.b. die Fixwerte z.b.
PHP:
abstract class pluginloader{
public function getheader(){
return false;
}
}

in meiner Pluginklasse mit
PHP:
class plugin extends pluginloader{

public function getHeader(){
echo "test";
}
}
überschreiben wenn ich das richtig verstanden habe.
 
kA. in welcher Form du jetzt "Pluginloader" meinst,
aber das wa du zeigst ist ganz allgemein Vererbung. abstract ist nicht zwingend nötig da.

Wenn man die Vaterklasse nicht direkt instanzieren dürfen soll macht das abstract Sinn.

Was keinen Sinn macht: Wenn die Methode von Kindklassen sowieso
überschrieben werden soll/muss, warum dann in der Vaterklasse
dafür überhaupt Code bereitstellen?
Damit könnte das Kind auch ohne eigene Implementierung sein.
Wenn die Methode in der Vaterklasse codelos ist (darf ja sein, wegen abstract)
ist jedes Kind praktisch gezwungen, eine eigene Implementierung bereitzustellen.
Vater hat ja keine.
 
Zurück