echo $begrüßung;
Ich hab mir gerade noch ein Paar Zeilen im ZF angesehen; jetzt habe ich erst verstanden, was da passiert. Ich dachte die ganze Zeit, die ganzen Funktionen in den Zend-Klassen wären eigenständige Funktionen, die im gesamten Script-Verlauf genutzt werden können, dabei sind es ja „Klassen-Interne Funktionen“, auf die nur innerhalb der Klasse zugegriffen wird (so habe ich es jetzt verstanden, ist meine vermutung richtig?).
Wenn vor Methoden oder Eigenschaften ein private oder ein protected steht, sind diese nur für den internen Gebrauch bestimmt. Wenn der Sichtbarkeitsmodifizierer public davorsteht, ist eine allgemeine Verwendung vorgesehen. Nimm zum Beispiel eine Datenbank-Klasse. Die hat eine Methode GibMirDaten(), die public ist. Um aber die Aufgabe zu erfüllen sind intern einige Schritte zu erledigen. Die Verbindung muss aufgebaut und das Statement zusammengesetzt werden. Es muss an das DBMS gesendet und die Daten in Emfang genommen werden. Diese Vorgänge will man vor dem Hauptprogramm verbergen, den Code der Klasse aber trotzdem strukturieren und nicht alles in eine große Methode schreiben. Zumal es ähnliche Methoden gibt (GibMirAndereDaten()), bei denen sich der interne Ablauf nur in wenigen Details unterscheidet und man den vorhandenen Code mehrfach nutzen möchte.
» Eine Klasse nur mit statischen Methoden und Eigenschaften nimmt man aber eigentlich nur dann, wenn man die Klasse als Namensraum "missbrauchen" möchte.
Um dem missbrauch vorzubeugen habe ich auch einen Konstruktor in die Klasse eingebaut ;)
Das hat damit nichts zu tun. Statische Methoden sind (unter PHP) unabhängig von einem Konstruktor. Ich nehme an, sie wurden als Ergänzung zur Klasse erfunden, um spezielle Aufgabenstellungen zu erfüllen. Beispielsweise wenn dafür gesorgt werden soll, dass von einer Klasse nur eine einzige Instanz existieren darf (Singleton-Pattern), macht man den Konstruktor private, was zur Folge hat, dass man von der Klasse nicht mehr mit new ein Objekt erzeugen kann. Man erstellt aber eine statische Methode (GibMirInstanz()) dazu, die man als public deklariert und die die Aufgabe hat, die eine einzige Instanz zu liefern, sie bei der ersten Verwendung vorher zu erzeugen und sich dann dieses erzeugte Objekt für die anderen Interessenten zu merken. Da diese statische Methode zur Klasse gehört, hat sie die Berechtigung, den private-Konstruktor aufzurufen.
Statische Methoden sind also als Zusatz zu Klassen zu sehen. Allerdings gibt es auch Aufgaben, bei denen man keine Instanz benötigt, aber aus Gründen der Ordnung gern alles unter einem Hut hätte. Beispielsweise eine Klasse, die mathematische Funktionen (Sinus, Cosinus, Max, Min, Exp, usw.) zur Verfügung stellt. Da braucht man keine Instanz, weil man einfach nur aus einem oder mehreren Werten einen neuen Wert berechnet und das war's.
Für PHP ist eine Math-Klasse weniger sinnvoll, denn es gibt bereits eine ganze Reihe von Funktionen dafür, die man einfach aufrufen kann. Unter PHP ist die OOP ja auch nur ein Zusatz. Unter komplett OOP-designten Sprachen, bei denen es keine eigenständigen Funktionen gibt, kann man das nur mit statischen Methoden lösen, wenn man das Ganze komfortabel handhabbar gestalten will. Jedes Mal erst ein Objekt erzeugen zu müssen, wenn man mal einen Sinus braucht, wäre etwas umständlich.
So sieht nun die Klasse aus:
class Menu {
function __construct($Title) {
$this->liste = "<p>$Title</p>";
}
Das sieht mir eher danach aus, als ob du mit der Klasse Daten verwalten willst und einige Methoden bereitstellen willst, um diese Daten zu be-/verarbeiten. Dann solltest du eher Objektmethoden verwenden, also keine statischen (die Klassenmethoden genannt werden).
// Zugriff auf das Objekt[?]
$MyList = new Menu('Mein Titel');
echo $MyList->liste; // Ausgabe: <p>Mein Titel</p>// Zugriff auf die einzelnen Methoden[?]
echo Menu::Level_1(); // Ausgabe: test level 1
echo Menu::Level_2(); // Ausgabe: test level 2
Kann man rein syntaktisch so machen.
Nur noch mal, falls dir das noch nicht klar ist: Die Verwendung von statischen Methoden ist unabhängig von Instanzen. Du kannst also Menu::Level_1() aufrufen, ohne vorher mit new ein Objekt erzeugt zu haben. (Inwieweit die eine oder andere Vorgehensweise sinnvoll ist, kommt immer auf die Aufgabenstellung an.)
echo "$verabschiedung $name";