Ich habe den folgenden Code in der Datei AbstractClass.php
im Ordner libraries
Wenn ich versuche, die AbstractClass
von controllers
wie folgt zu laden:
Ich bekomme Unable to load the requested class: AbstractClass
Fehler.
Was mache ich falsch? Soll ich die Datei einfach einbinden anstatt sie zu laden?
Danke
Nun, offensichtlich können Sie eine abstrakte Klasse nicht direkt laden, da dies gegen den Punkt einer abstrakten Klasse geht.
Sie können eine abstrakte Klasse in eine Datei zusammen mit einer anderen Bibliothek einfügen, aber das ist ein wenig sinnlos und widerspricht dem Standard "Eine Klasse eine Datei", den CI (und alle guten Standards) vorschlagen.
Sie können diese Datei in Ihre Bibliotheksdateien mit einem include () einschließen oder eine __autoload () -Funktion einrichten, um dies für Sie zu tun. Der beste Platz für ein __autoload () ist das Ende der config.php.
Ich benutze abstrakte Klassen mit CodeIgniter-Bibliotheken, weil ich allgemeine Methoden habe, die alle geerbten Klassen verwenden sollen, die alleine bedeutungslos sind. Ich weiß nicht, ob das, was ich vorschlage, Best Practice ist. Ich vermute es ist nicht, aber ich persönlich finde es nützlich. Hier ist, wie ich es mache:
Erstellen Sie im CodeIgniter-Anwendungsordner einen neuen Klassenordner .
Fügen Sie diesen Ordner zum Pfad hinzu. (Normalerweise mache ich das im Controller.)
%Vor%Erstellen Sie die abstrakten Klassen oder andere Klassen im Ordner classes .
Erstellen Sie eine erweiterte CodeIgniter-Bibliothek:
%Vor%Verwenden Sie die Bibliothek wie gewohnt:
%Vor%Das sollte den Trick machen. Ich hoffe, das ist nützlich.
Ok. Ich weiß, das ist viel zu spät, aber ich bin sicher, dass viele Leute Fragen dazu haben.
Dies ist eigentlich eine Einschränkung der Loader-Kernklasse, da sie versucht, alle durch den ersten Parameter definierten Elemente zu instanziieren. Wie wir alle wissen, sind abstrakte Klassen nach ihrer Definition abstrakt und können NICHT instanziiert werden. Wie umgehen wir das?
Aber am wichtigsten: Wie umgehen wir das, während wir uns an die CodeIgniter-Standards halten?
Da ich gerade erst angefangen habe, CodeIgniter zu verwenden, kann ich nicht mit Sicherheit sagen, wie Core Extensions in der Vergangenheit gehandhabt wurden. In der neuesten Version ermöglicht Ihnen das CodeIgniter-Framework jedoch, seine Kernklassen zu erweitern und zu überschreiben, indem Sie den Dateinamen mit Ihrem definierten Unterklassenpräfix (in den meisten Fällen "MY_") und dem Namen der Datei, die Sie erweitern möchten, voranstellen.
* / application / core / MY_Loader.php *
%Vor%Die Chancen stehen gut, dass Sie, wenn Sie wissen, wie abstrakte Klassen verwendet werden, wissen, was das bedeutet. Im Grunde erbt diese Klasse jetzt alle Eigenschaften und Methoden der ursprünglichen CI_Loader-Klasse. Das obige Code-Snippet ist technisch gesehen ein exaktes Duplikat der ursprünglichen Loader-Klasse, aber das Wichtigste ist, dass diese Klasse jetzt alle Lade-Methoden anstelle des Originals übernimmt.
Jetzt müssen wir der Ladeklasse nur noch die Möglichkeit geben, zu wissen, ob sie eine konkrete Klasse lädt und instanziiert oder ob sie einfach eine abstrakte Klasse enthält.
Es gibt zwei Methoden, die das Laden von Bibliotheken übernehmen:
Methode 1) public function library
Methode 2) protected function _ci_load_class
Methode 1 behandelt die Verarbeitung aller Parameter, die an sie übergeben werden, indem sie sich selbst durchläuft, wenn der erste Parameter ein Array ist, stellt sicher, dass die bereitgestellten Daten sauber sind und verhindert, dass bestimmte Aktionen ausgeführt werden, wenn bestimmte Kriterien nicht erfüllt sind / p>
Methode 2 behandelt das tatsächliche Laden der erforderlichen Assets, die Fehlerbehandlung usw.
Wir können das Verhalten der Methoden 1 und 2 überschreiben, indem wir sie in unserer neuen MY_Loader-Klasse neu definieren. Ich habe dies getan, indem ich fast exakte Replikate der ursprünglichen Methoden erstellt habe, aber mit dem Zusatz eines vierten Parameters, der - wenn er zutrifft - verhindert, dass der Loader die definierte Bibliotheksklasse in der zweiten Methode instanziiert. Ich habe auch eine zusätzliche Methode public function abstract_library
enthalten, die es Ihnen erlaubt, die Bibliothek explizit als Kurzdarstellung zu definieren.
Das Folgende ist die Klasse MY_Loader.php in ihrer Gesamtheit. Dies wirkt sich nicht auf vorhandene Aufrufe der Bibliotheksmethode aus.
Hoffe, das hilft!
* / application / core / MY_Loader.php *
%Vor%Laden einer abstrakten Bibliothek:
%Vor%Ich habe im Web der abstrakten Klassen mit CI keine Beispiele gesehen, also wollte ich bestätigen, dass Sie eine abstrakte Bibliothek haben können. Es gibt sehr gute Gründe, die für OOP grundlegend sind, warum abstrakte Klassen nützlich sind. Grundlegend für mich, dass die Kindklassen bestimmten Konsistenzen folgen.
Lassen Sie mich wissen, wenn Sie ein Beispiel benötigen, da Sie die abstrakte Klasse manuell einfügen müssen, stellen Sie sicher, dass Sie es nur einmal machen, damit Sie keine Probleme mit dem Umbenennen von Klassen bekommen.
Vergessen Sie auch nicht, wenn Sie eine statische Funktion oder Variable in der Klasse Abstract haben, können Sie immer noch direkt darauf zugreifen, ohne die Klasse laden zu müssen, wie in
%Vor%Tags und Links php codeigniter