Dans Perl, les objets sont généralement des références à des hachages, et les "slots" (emplacements) sont des champs distincts du hachage qui contiennent des données d'objet. Pour économiser du code et créer dynamiquement des méthodes, on utilise souvent la méthode magique AUTOLOAD.
AUTOLOAD permet d'intercepter les appels de méthodes inexistantes et de les implémenter dynamiquement "à la volée". Exemple – génération automatique de méthodes getter et setter :
package MyObj; sub new { bless { foo => 1, bar => 2 }, shift } our $AUTOLOAD; sub AUTOLOAD { my ($self) = @_; my $field = $AUTOLOAD =~ s/.*:://r; die "Pas de slot tel $field" unless exists $self->{$field}; return $self->{$field}; } my $obj = MyObj->new; print $obj->foo; # 1
Les dangers :
En quoi AUTOLOAD diffère-t-il de la définition directe d'une méthode ? Quels sont les inconvénients de l'utilisation d'AUTOLOAD pour tous les accesseurs de la classe ?
Réponse : AUTOLOAD fonctionne au moment de l'exécution, contrairement aux méthodes explicites. En général, les erreurs liées à un nom de méthode incorrect ne se manifestent qu'à l'exécution, et non à la compilation, ce qui complique le débogage. Exemple de mauvaise utilisation :
$obj->fop; # au lieu de foo – ne provoquera pas d'erreur de compilation, ira dans AUTOLOAD
Il est préférable de générer explicitement des méthodes via eval dans une section compilable.
Histoire
Histoire
Histoire
Dans une bibliothèque de sérialisation d'objets, les méthodes étaient générées automatiquement via AUTOLOAD, mais ils ont oublié d'implémenter un DESTROY spécial, ce qui a conduit à ce qu'en supprimant des objets, AUTOLOAD se déclenche, des erreurs sur l'absence de méthode DESTROY apparaissent et des fuites de mémoire se produisent.