TutoPerlOO
Introduction à la programmation orientée objet en Perl
Cette page montre brièvement comment créer un objet en se basant sur l'exemple. Dans notre exemple, nous allons créer un objet User
permettant dans un programme Perl de manipuler une liste de personnes.
Un premier exemple simple
Le code
La façon standard pour créer une classe est de commencer par créer un fichier dont l'extension est .pm
. Notre classe User
est ainsi défini dans le fichier
User.pm
package User;
use strict;
sub new {
my $self =
{};
$self-
>{LOGIN
} =
undef;
$self-
>{UID
} =
undef;
bless($self);
return $self;
}
# 1er arg. : reference vers une instance.
# Autres arg. : arguments passes a la fonction.
sub login
{
my $self =
shift;
if (@_) {
$self-
>{LOGIN
} =
shift;
}
return $self-
>{LOGIN
};
}
sub uid
{
my $self =
shift;
if (@_) {
$self-
>{UID
} =
shift;
}
return $self-
>{UID
};
}
1;
# pour que l'appel a 'require' ou a 'use' fonctionne
Explication
Cette directive est indispensable pour définir une classe (en Perl, une classe est en fait vu comme un package).
La méthode new
est le constructeur permettant d'initialiser un objet de la classe User
.
Concrètement, la fonction bless
crée une instance et le constructeur new
renvoie une référence vers cette instance.
sub login
{
my $self =
shift;
if (@_) {
$self-
>{LOGIN
} =
shift;
}
return $self-
>{LOGIN
};
}
La méthode login
renvoit la valeur de l'attribut LOGIN
. Si une valeur est passée en paramètre, la valeur de LOGIN
est modifiée. On remarque que le premier argument passé par Perl est une référence vers l'instance.
Utiliser la classe User
, un exemple
#!/usr/bin/perl
use User;
$my_user = User-
>new();
$my_user-
>login("root");
print "login:",
$my_user-
>login(),
"\n";
Un constructeur plus complexe
Il arrive que l'on souhaite créer une instance à partir d'une instance déjà créée.
Le constructeur de ce module utilise la variable $proto qui est une référence vers une instance existant pour initialiser le nouvel objet :
sub new {
my $proto =
shift;
my $self =
{};
if( ref($proto) ) {
$self-
>{LOGIN
} =
$proto-
>{LOGIN
};
$self-
>{UID
} =
$proto-
>{UID
};
} else {
$self-
>{LOGIN
} =
undef;
$self-
>{UID
} =
undef;
}
bless($self);
return $self;
}
Ce nouveau constructeur permet donc la création d'une nouvelle instance à partir d'une autre :
$other_user = $my_user->new();
Définir automatiquement une méthode grâce à AUTOLOAD
La fonction AUTOLOAD
est appelée si la methode demandée n'est pas définie. Dans ce cas, la variable $AUTOLOAD
prend le nom de la méthode appelée :
package User;
use strict;
use vars
qw($AUTOLOAD);
sub new {
my $proto =
shift;
my $self =
{};
if( ref($proto) ) {
$self-
>{login
}=
$proto-
>{login
};
$self-
>{uid
}=
$proto-
>{uid
};
} else {
$self-
>{login
} =
undef;
$self-
>{uid
} =
undef;
}
bless($self);
return $self;
}
sub AUTOLOAD
{
my $self =
shift;
my $name =
$AUTOLOAD;
# nom de la methode. Ex : 'User::login'.
$name =~
s/.
*::
//;
if(@_) {
$self-
>{$name} =
shift;
}
return $self-
>{$name};
}
1;
Ce tutoriel est sous licence Gnu FDL. Copyright (C) 2008, Arnauld Michelizza
TutoPerlOO