Übergeordnete statische Methoden in PHP
Habe ich eine abstrakte page-Klasse so Aussehen:
abstract class Page {
public static function display() {
self::displayHeader();
self::displayContent();
self::displayFooter();
}
public static function displayContent() {
print "<p>some content</p>";
}
public static function displayHeader() {
include_once(kContent . "HeaderContent.class.php");
HeaderContent::display();
}
public static function displayFooter() {
include_once(kContent . "FooterContent.class.php");
FooterContent::display();
}
};
Ich würde gerne Unterklasse von diesem, und nur das überschreiben der displayContent-Methode, sodass die Kopf-und Fußzeile wird automatisch angezeigt, aber immer noch die option zum überschreiben der Methode display zum Beispiel .js-Dateien.
Nun habe ich noch eine Klasse, die Aussehen wie diese:
class FooPage extends Page {
public static function displayContent() {
print "<p>Foo page</p>";
};
Nun, anstelle von aufrufen der FooPage ist displayContent
Methode, es ruft einfach nur die eine aus der Oberklasse.
Warum? Was kann ich tun?
BEARBEITEN
Ich bin mit PHP 5.2.17
Verwenden
mögliche Duplikate von bei der Verwendung von selbst -, Eltern -, Statik-und wie?
nicht ein Duplikat ist, hat bei mir nicht funktioniert.
Warum ist die
Dann bekommt man nicht die Vererbung zurück. 🙂
static
statt self
.mögliche Duplikate von bei der Verwendung von selbst -, Eltern -, Statik-und wie?
nicht ein Duplikat ist, hat bei mir nicht funktioniert.
Warum ist die
display()
Methode statisch? Tun Sie es nicht, wenn Sie bereits ein Objekt. Und dann die Vererbung funktioniert mit $this
.Dann bekommt man nicht die Vererbung zurück. 🙂
B::foo()
passieren zu A:foo()
durch statische Bindung und es wird A::foo()
als wenn es direkt aufgerufen. Nichts wirklich Sie über es tun können.InformationsquelleAutor NSAddict | 2012-11-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ilija, PHP < 5.3 nicht "Späte Statische Bindung" und das ist, warum Sie werden erleben, die
FooPage::displayContent
nicht genannt. Wenn Sie PHP 5.2, dann gibt es nichts viel zu machen (außer für einige hacks mit debug_backtrace(), die ehrlich gesagt, ich würde nicht empfehlen, für diese situation).Nun, was es wirklich fordert meine Aufmerksamkeit ist, dass Sie Ihre Methoden sind alle statisch, gibt es einen Grund für dieses? Warum sind Sie nicht Instanz-Methoden? Ich würde etwas erwarten wie:
und später in Ihrer Anzeige schreiben Sie etwas wie:
Einige Dinge zu berücksichtigen:
Beispiel:
HTH
Dies war gedacht, damit ich drucken kann Sachen durch schließen der php-tags, einfügen von meinem html-code, und öffnen Sie die php-tags wieder. So bekomme ich eine syntax-Hervorhebung.
Gut, das ist vor allem eine Frage des Geschmacks und jede person anzeigen, die auf "elegante" - Codierung. Ich bevorzuge das verlassen der ob_start(); Mechanismus für Zeiten, wenn es ist die einzige Wahl. Von meinem POV Rückgabe ein string ist ein eleganter Ansatz, auf Kosten zu verlieren, syntax-highlighting. Wie viele andere Dinge der Programmierung es ist immer ein trade-off, und Sie sollten wählen, die am besten passt Ihre Bedürfnisse. Allerdings, wenn Sie gehen mit dem ob_start () - Ansatz würde ich dir raten, zu erstellen Sie eine "output-grabber" - Objekt kapselt, dass in einer Methode, so dass Sie nicht wiederholen Sie die ob_* - Prozess N-mal.
InformationsquelleAutor Andrés Fortier