Hallo pl,
deine Kritik läuft darauf hinaus, dass OOP in Perl hemdsärmelig dazugestrickt sehr offen gestaltet ist, während PHP es systematischer angeht.
Eine Klassendeklaration ist ein Stempel, mit dem Du beliebig viele Objekte erzeugen kannst. Das Protokoll, wie die Objektreferenz den Methoden bekannt gegeben wird, ist festgelegt.
Eine Klassendeklaration in Perl gibt's überhaupt nicht, du segnest einfach ein Objekt mit einem Package und die Funktionen darin sind dann die Methoden. Darum kann man das schlecht vergleichen. Ob ich nun $this
vorgekaut bekomme oder es mir explizit herausshift
e, ist vermutlich bis auf ein paar Nanosekunden egal. Aber ich muss in die Methode schauen und gucken ob sie sich ein $self
herausholt, um zu wissen, ob sie statisch ist oder nicht.
Die Deklaration von Eigenschaften und Methoden in einer Klassendeklaration hat den zwei Zwecke.
-
Man sieht deutlich an der Deklaration, was die Klasse enthält und wie es verwendet wird (statisch/Instanz, private/protected/public). In Perl muss ich das Package inspizieren und den Konstruktor finden und verstehen, um das zu wissen.
-
Ich kann Datenkapselung betreiben, indem ich bestimmte Eigenschaften oder Methoden als private oder protected deklariere, so dass sie nur innerhalb der Klasse verfügbar sind. Dadurch verhindere ich, dass Unbefugte den Zustand meines Objekts verändern (ja, ich weiß, die FP-Vertreter wenden jetzt ein, dass ein veränderlicher Objektzustand ohnehin die Quelle der meisten Übel ist). Ob man in Perl überhaupt private Eigenschaften kennt, habe ich nicht herausgefunden.
In PHP hingegen wird zwischen new und Konstruktor unterschieden
PHP erledigt einiges der Instanz-Erzeugung eigenständig (Speicher für Eigenschaften allocieren, Objekt mit der Klasse segnen), darum gibt's einen new-Operator der das auslöst. Der Konstruktor muss dann von PHP selbst gefunden werden können, damit man ihn nicht bei jedem new Foo() explizit angeben muss.
Noch verwirrender in PHP ist, Eigenschaften der Instanz klassenweit zu deklarieren obwohl noch gar keine Instanz existiert.
Es ist eine Deklaration, mehr nicht. Sie dient - wie oben geschrieben - als Stempel für den Moment, wo die Klasse instanziiert wird. Dass Du undeklarierte Eigenschaften dynamisch hinzufügen kannst, führt aus meiner Sicht zu schwer verständlichem Code. Ab PHP 7.4 wird das weiter verbessert, da geht (optional) dies:
class Foo {
private int $i;
public function __construct() {
$this->i = 47;
$this->i = "Hugo";
}
}
Ohne deklarierte Eigenschaften hättest Du diese Möglichkeit nicht. Ich bin ein Fan von statisch getypten Sprachen, die ersparen viel Kopfschmerz.
Übrigens, für Perl-Nostalgie in PHP kannst Du sowas programmieren (solltest Du aber nicht, jede Sprache hat ihre Idiome und man sollte sie nicht transplantieren):
class Foo {
static function new() {
return new Foo();
}
function __construct() {
}
}
$f = Foo::new();
Und eine reservierte Funktion In PHP 5 kannst Du den Konstruktor einer Klasse Foo noch Foo() nennen, ab 7 ist das deprecated und es gibt nur noch __construct.
Das soll jetzt keine Wertung darstellen. PHP gibt Dir die Möglichkeit, mehr zu erzwingen. Perl lässt Dir viel mehr Freiheiten. Aus meiner Sicht sind das Freiheiten, die das Verständnis des Programms erschweren können. Aber das bin nur ich.
Rolf
--
sumpsi - posui - clusi