print · rss · source

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

package User;

Cette directive est indispensable pour définir une classe (en Perl, une classe est en fait vu comme un package).

sub new {
    my $self  = {};
    $self->{LOGIN} = undef;
    $self->{UID}   = undef;
    bless($self);
    return $self;
}

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

print · rss · source
Page last modified on September 08, 2008, at 03:44 PM