Tach!
Also ich bin eher gegen public Eigenschaften. Wobei deine Idee mich da schon wieder in Versuchung führt, da sie gut ist.
Für mich sind Eigenschaften jedoch etwas privates. Methoden dagegen sind Schnittstellen. Deshalb möchte ich nur über Schnittstellen kommunizieren.
Mit "meiner" Idee kannst du sogar beides haben, Variablenzugriff (über Overloading) und Getter/Setter-Methoden. Und da fällt mir noch ein, dass eigentlich auch nur eine Methode braucht (falls das nicht gegen SOLID verstößt)
function foo($newFoo = null) {
if ($newFoo !== null) { // oder func_num_args() befragen, wenn null ein gültiger Wert sein darf
// Wertprüfungen etc.
$this->foo = $newFoo;
}
// was sonst noch so fürs Getten zu tun ist
return $this->foo;
}
Kann man als Getter und Setter verwenden, aber nicht fürs Method Chaining. Oder vielleicht doch, wenns dafür undurchsichtiger sein darf. Setzen und Lesen will man ja meist nicht gleichzeitig, also gibt man bei übergebenem Argument das Objekt (fürs Chaining) zurück, ansonsten den Wert.
Außerdem hab ich da mal einen Artikel über "method chain" gelesen der mich aufhorchen hat lassen.
$objObjekt->methode1()->methode2()
Ist nett, darf man aber auch mal kritisch ansehen. Was ist wenn eine Methode ein anderes Objekt zurückgibt. Chainst du dann einfach weiter? Kann man vermutlich nicht definitiv beantworten, ohne einen konkreter Fall vorliegen zu haben und dabei zu sehen, ob es verständlich oder verwirrend ist. - Ja, man darf das ruhig schlecht finden, ich weiß auch nicht, ob ich das ernsthaft so implementieren würde.
Der Artikel ging über Java7. Darin soll es einen Chaingkontroll geben, der definiert in welcher Reihenfolge die Methoden aufgerufen werden müssen. [...] Deshalb soll man über ein Interface (oder wie auch immer) angeben können in welcher direkten Logischen Reihenfolge die Methoden aufgerufen werden müssen. Also hier wäre der Ausdruck in etwas: save darf erst aufgerufen werden, wenn setData min. 1 mal aufgerufen wurde. Verstößt man gegen diese Angabe meckert der Interpreter oder der Compiler. Man merkt den Fehler also sofort beim testen.
Auch nett, aber nur mit der damit einhergehenden Komplexität zu haben. Wobei die sich vermutlich nur auf die Angabe und das Erstellen der Interfaces beschränkt. Wenn ich mich recht erinnere, definiert man als Rückgabetyp ein Interface und das definiert anhand der erlaubten Nachfolger die aufrufbaren Methoden.
Deshalb setze ich auf Methoden (und hab mir angewöhnt bei void Methoden ein this zurück zu geben). Deine magischen Methoden würden den oben beschriebenen Ansatz nicht schaffen.
Nur dass du bei PHP keinen Rückgabetyp festlegen kannst und damit kein Compiler die Reihenfolge prüfen kann. Es gibt ja nur Type-Hints bei Funktionsparametern.
dedlfix.