Wird der Konstruktor immer ausgeführt? Auch wenn man keine Klasse (bzw. das Objekt) erzeugt?
Was um Himmels Willen ist eine Instanz, in diesem Zusammenhang?
In den Tutorials, die ich gelesen habe, kam weder das Wort Instanz vor, noch wurden statische und nicht-statische Funktionen in einem Beispiel zsm. verwendet.
Du kannst keine Klassen erzeugen, du kannst höchstens Objekte aus Klassen erzeugen (bitte die Begrifflichkeiten auseinander halten - das ist wichtig)
1. Die Klasse ist der Bauplan für ein Objekt. Mit dem Schlüsselwort "new" erzeugst du ein neues Objekt aus dieser angegebenen Klasse. Beim Erzeugen des Objekts wird der Konstruktor aufgerufen (falls vorhanden); Es sei denn, der Konstruktor ist privat deklariert. Privat gekennzeichnete Mitglieder einer Klasse sind nur innerhalb der Klasse verfügbar und können nicht von "außen" zugegriffen werden.
Beispiel für den Zugriff innerhalb der Klasse ist, wenn die Methode einer Klasse auf eine Mitgliedsvariable oder eine weitere Methode derselben Klasse zugreifen will. Man sagt auch, der Zugriff ist privat (private).
Zugriff von außen ist bspw. wenn aus einem Bereich außerhalb der Klasse auf eine Eigenschaft oder Methode zugegriffen werden soll. Man spricht auch von einem öffentlichen (public) Zugriff.
Es gibt noch den protected-Zugriff, aber das lassen wir erstmal beiseite. Kann man später drüber fabulieren.
Damit ich also auf die Variable oder Methode einer Klasse von außerhalb derselben Klasse zugreifen kann, muss diese Variable oder Methode öffentlich also public sein. Ist das nicht der Fall, wird der Parser es mit einem fatal error quitieren.
Was jedoch funktioniert, ist, innerhalb der Klasse auf öffentliche Mitgliedsvariablen oder Methoden zuzugreifen.
2. Instanz
Eine Instanz hast du immer dann, wenn du mit "new" eine solche erzeugst. Prinzipiell ist jedes Objekt eine Instanz.
Klären wir das mal anhand von meinem Lieblingsbeispiel: Autos (ich weiß, klingt doof - trifft es aber)
- Du hast den Bauplan für ein Auto, nennen wir es mal Porsche 911 - das wäre die Klasse
- Du machst daraus ein neues Auto, also ein konkretes Objekt, was man anfassen, benutzen, sonst was machen kann (über Methoden) - das wäre Instanz 1
- Dein Kumpel macht aus dem Bauplan, den du ihm freundlicherweise gegeben hat, noch ein Auto; mit diesem Objekt kann man das gleiche machen, wie mit deinem - das wäre Instanz 2
Damit man ein neues Auto aus dem Bauplan erzeugen kann, braucht man einen Konstruktor. Dabei handelt es sich einfach um eine Methode, die einen bestimmten speziellen Namen "__construct" hat.
3. Vererbung
Es gibt für alle Objekte einen Standard-Konstruktor (der leer ist und keine Funktionalität beinhaltet). Deshalb ist es nicht schlimm, wenn du einen Bauplan hast, in dem kein eigener Konstruktor drin ist - es wird einfach der Standard-Konstruktor verwendet. Man kann jedoch den Standard-Konstruktor verändern, in dem man ihn überschreibt - das geht übrigens mit allen Methoden. Überschreiben ist einfach. Man schreibt einfach eine neue Methode, die genauso heißt wie die, die man überschreiben will. Damit wird der Standard-Konstruktor hinfällig und auch nicht mehr ausgeführt.
Was das mit Vererbung zu tun hat? Prinzipiell ist jede Klasse, die du selbst schreibst, eine Vererbung der Klasse "stdClass", die es in PHP bereits gibt. Wenn man schon mal mit anderen OOP-Sprachen zu tun hatte (Java, C#, etc.) kennt man das Prinzip vielleicht, dort heißt das Dingens einfach nur "Object".
Und wenn die Tutorials zu OOP nicht mal elementare Begriffe wie "Instanz" oder statischen und instanz-behafteten Zugriff erklären und die Sachen einfach verwenden, ohne zu beschreiben, was genau damit gemacht wird, sind die Tutorials keine solchen. ;-)
Du solltest auf jeden Fall erstmal den Unterschied zwischen Klasse und Objekt verstehen. Klasse = Bauplan, Objekt (Instanz) = Ergebnis der <Konstruktion> aus einem Bauplan.
Wie in der realen Welt.
Objekt-orientiertes Programmieren beginnt im Kopf - nicht am Computer. ;-) Unser menschliches Gehirn ist bereits objekt-orientiert - es müsste uns eigentlich sehr leicht fallen, das Prinzip der OOP zu verstehen.
Du solltest aber auch nicht vergessen, das dieses Pattern eigentlich die Pest ist, eine regelrechte Modeerscheinung, da haben sich wohl mal einige Programmierer die Mühe gemacht und das komplette Ding zerpflückt und eine "Globale Sichtbarkeit" der Klasse festgestellt, welches eigentlich total unerwünscht war (ich selber finde dieses Pattern nicht schlecht), habe allerdings inzwischen meine Factory mit Import und brauche eigentlich keine Singleton mehr
[ ] Du hast den Sinn und Zweck sowie den Unterschied zwischen Factory- und Singleton-Pattern verstanden.
Wenn man das beides direkt miteinander vergleichen könnte, bräuchte man eines von beiden nicht. Beide Entwurfsmuster haben ihre Daseinsberechtigung - vom jeweiligen Anwendungsfall aus gesehen. Singleton ist genau das, Factory macht genau das.
Singleton = immer nur eine Instanz von sich selbst
Factory = eine neue Instanz von irgendwas (evtl. ist sogar erst zur Laufzeit klar, was die Factory für ein Objekt zurückgeben wird)
Du würfelst hier wild mit Begriffen umher, die du selbst anscheinend noch nicht verstanden hast und verwirrst damit die Leute nur. Sei doch bitte etwas behutsamer - vor allem mit den Anfängern, die im Gegensatz zu dir noch wirklich am Anfang stehen.