In Perl sind Objekte in der Regel Verweise auf Hashes, und "Slots" sind einzelne Felder des Hashes, die die Objektdaten speichern. Um den Code zu vereinfachen und dynamisch Methoden zu erstellen, wird oft die magische Methode AUTOLOAD verwendet.
AUTOLOAD ermöglicht es, Aufrufe nicht existierender Methoden abzufangen und sie "im Fluss" dynamisch zu implementieren. Ein Beispiel ist die automatische Generierung von Getter- und Setter-Methoden:
package MyObj; sub new { bless { foo => 1, bar => 2 }, shift } our $AUTOLOAD; sub AUTOLOAD { my ($self) = @_; my $field = $AUTOLOAD =~ s/.*:://r; die "Slot $field existiert nicht" unless exists $self->{$field}; return $self->{$field}; } my $obj = MyObj->new; print $obj->foo; # 1
Gefahren:
Was unterscheidet AUTOLOAD von der direkten Definition einer Methode? Welche Nachteile hat die Verwendung von AUTOLOAD für alle Zugriffs-Accessor-Methoden der Klasse?
Antwort: AUTOLOAD arbeitet zur Laufzeit, im Gegensatz zu expliziten Methoden. In der Regel treten Fehler im Zusammenhang mit falschen Methodennamen erst zur Laufzeit auf und nicht zur Compile-Zeit, was das Debuggen erschwert. Beispiel für falsche Verwendung:
$obj->fop; # anstelle von foo — führt nicht zu einem Kompilierungsfehler, gelangt zu AUTOLOAD
Es ist besser, Methoden explizit über eval im kompilierbaren Abschnitt zu generieren.
Geschichte
Geschichte
Geschichte
In einer Bibliothek zur Serialisierung von Objekten wurden Methoden automatisch durch AUTOLOAD generiert, jedoch wurde vergessen, einen speziellen DESTROY zu implementieren, sodass beim Löschen von Objekten AUTOLOAD ausgelöst wurde, was zu Fehlern über das Fehlen der DESTROY-Methode und zu Speicherlecks führte.