Probleme mit Klasse

[quote=„marvink1993“]Wenn ich die Funktion jedoch include und folgendermaßen aufrufe,

[code]$k = new Password(10);

echo $k;[/code]
bekomme ich eine Fehlermeldung angezeigt:

[quote]Catchable fatal error: Object of class Password could not be converted to string in /test/test.php on line 6
[/quote][/quote]
Richtig so - mit new …() rufst du den Konstruktor der Klasse auf, und ein Konstruktur soll ein Objekt zurückgeben.

Dieses Objekt mit echo ausgeben zu wollen, ist allerdings nicht sinnvoll.

[quote]rufe ich das Script jedoch folgendermaßen auf,

[code]$k = new Password(10);

echo $k->string;[/code]
funktioniert die Ausgabe bestens.[/quote]
Das ist ja auch der „richtige“ Weg.

Du erzeugst ein Objekt, und greifst anschliessend auf eine Eigenschaft von diesem zu - diese ist von einem skalaren Datentyp, und lässt sich daher direkt mit echo ausgeben.

(Ob die Eigenschaft von der Sichtbarkeit her direkt ansprechbar sein sollte, oder ob man noch eine Methode baut, um diesen Wert auszulesen bzw. dafür eine getter-Methode definiert, wäre noch zu überlegen.)

Er liegt im Konzept, bzw. deinem Verständnis von OOP.

Wenn du etwas haben willst, was „direkt“ ein Ergebnis zurückgibt, welches sich ausgeben lässt - dann nutze kein Objekt, sondern eine simple Funktion.

Wenn du jedoch nach dem OO-Paradigma arbeiten willst - dann erstelle zunächst ein Objekt, und rufe dann anschliessend die Methode dieses Objektes auf, die dafür zuständig ist, ein ausgebbares Ergebnis zurückzuliefern. Letzteres ist niemals Aufgabe des Konstruktors! (Die Methode könnte bei einem sehr simplen Objekt auch die magische Methode __toString sein, die dann implizit aufgerufen würde, wenn das Objekt für eine Ausgabe in einen Stringkontext überführt werden muss.)

Wenn du dir dabei dann sorgen machen solltest, dass du für mehrmaliges Generieren eines Passwortes auch mehrere Instanzen erstellen müsstest - dann gebe dem Objekt eine statische Methode, die ein Passwort generiert und zurückliefert, die kannst du dann auch ohne eine konkrete Instanz des Objektes aufrufen.