« retourner à la page principale du blog

Programmation orientée objet en PHP

Cet article s’adresse surtout à ceux qui savent déjà les principes de la programmation orientée objet, mais qui n’ont jamais pris le temps de faire le saut en PHP depuis l’ajout de ce paradigme en PHP4 et de son amélioration en PHP5. Je vais donc surtout parler de la syntaxe pour arriver aux résultats que vous êtes habitués de voir dans les autres langages.

Exemple de code

<?php

class User {

  public function __construct(){
    // code pour le constructeur
  }

  pubic function __destruct(){
    // code pour le destructeur
  }

  public function getName(){
    return $this->name;
  }

  public function setName($newName){
    $this->name = $newName;
  }

  protected $name;
}

// plus tard ...

$utilisateur = new User();
$utilisateur->setName("Roger");
echo $utilisateur->getName();

?>

Explications

Comme dans les langages à la C++, il y a les modificateurs d’accès public (par défaut), protected et private. Ils agissent exactement, à ma connaissance, comme en C++ (mais pas comme en Ruby). Les fonctions et variables déclarées public sont accessibles de l’extérieur de la classe. Celles déclarées protected ne sont accessible qu’à partir de l’intérieur de la classe et seront hérités si on étend cette dernière. L’utilisation de private ne rend accessible qu’à partir de l’intérieur de la classe (comme protected) mais en plus, elles ne seront pas hérités.

Le constructeur, qui est la fonction appellée lorsqu’on crée un nouvel objet avec new, est toujours nommée __construct. Le destructeur, qui est appelé lorsque l’objet est détruit, est toujours nommé __destruct.

On accède aux fonctions et variables de l’objet avec le nom de l’instance et le nom de la fonction ou la variable, séparés par ->. Rappelons que cette notation est toujours utilisée, car il n’y a pas vraiment de distinctions à faire avec les pointeurs comme en C++.

Le variable $this est en fait l’objet dans lequel nous somme actuellement. Contrairement au C++ où son utilisation est souvent optionnelle, en PHP, nous devont toujours l’utiliser pour référer aux variables et fonctions de l’objet. Si on ne l’utilise pas, nous faisont référence à une fonction globale ou une variable locale (ou globale si on la déclare globale).

Aussi à noter que la définition de la classe se termine par une accolade « } » sans point-virgule « ; » (on doit mettre un point-virgule en C++).

Héritage

L’héritage se fait avec le mot réservé extends. Exemple:

class SubscribedUser extends User { ... }

Il n’y a pas d’héritage multiple en PHP. Il y a par contre les interfaces, qui sont une sorte de classe qui ne contient que les prototypes des fonctions à implémenter. Exemple:

interface Person {

  public function setName($newName);
  public function getName();

}

class User implements Person {

  public function setName($newName){
    $this->name = $newName;
  }

  public function getName(){
    return $this->name;
  }

  protected $name;

}

Une interface ne peux pas être instanciée (on ne peut pas créer d’objet à partir d’une interface). On doit absolument l’implémenter dans une classe. Cette classe doit absolument implémenter toutes les fonctions de l’interface pour qu’on puisse en faire des objets. La manière de faire de l’héritage multiple en PHP est donc comme suit :

class A extends B implements C, D { ... }

Une interface est en fait une classe dont toutes les fonctions sont abstraites (abstract). On peut aussi déclarer une classe abstraite et ne pas implémenter certaines fonctions en les déclarant aussi abstraites. On ne pourra cependant pas en créer d’objet. On devra en faire hériter une autre classe qui implémentera toutes les fonctions abstraites. Exemple:

abstract class Person {

  public function setName($newName){
    $this->name = $newName;
  }

  public function getName(){
    return $this->name;
  }

  abstract public function addToDatabase();
  abstract public function removeFromDatabase();

  protected $name;

}

class User extends Person {

  public function addToDatabase(){
    // code pour ajouter à la base de donnée
  }

  public function removeFromDatabase(){
    // code pour supprimer de la base de donnée
  }
}

// plus tard ...

$unePersonne = new Person();  // ILLÉGAL
$unUtilisateur = new User();  // légal

À noter que les fonctions déclarées abstract doivent être public ou protected car elles doivent être héritées et définies pour que la classe ne soit plus abstraite.

Méthodes magiques

Nous avons vu au début de l’article les méthodes __construct et __destruct. Ce sont des méthodes magiques (magic methods). Elles sont nouvelles en PHP5. En plus du constructeur et du destructeur, il y a __autoload, __call, __clone, __get, __set, __sleep, __toString, __wakeup, __unset et __isset.

Je veux seulement attirer votre attention sur __clone et __toString. La méthode __clone est en fait le copy constructor. En PHP5, lorsqu’on passe un objet en paramètre dans une fonction, on le passe TOUJOURS par référence, alors qu’en PHP4, on devait préfixer le paramètre avec & dans la définition de la fonction. Générallement, on veut effectivement passer un objet par référence, mais quelque fois, on voudrait faire une copie de l’objet. Si on a défini la méthode __clone dans notre objet, on peut utiliser la syntaxe suivante:

$nouvelObjet = clone $monObjet;

La méthode __toString permet de traduire automatiquement l’objet en string lorsque c’est ce qu’on attend.

class User {

  //...

  public function __toString(){
    return $this->name;
  }

  //...
}

$utilisateur = new User();

//...

echo $utilisateur;

Variables statiques

On peut créer une variable statique, qui sera la même pour toute la classe (sans tenir compte d’un objet en particulier), avec le préfixe static. On y accède ensuite avec classe::$variable.

class User {
  // ...
  public static $count;
  // ...
}

// ...
echo User::$count;

En fait, on peut accéder aux variables statiques par plusieurs chemins différents. On pourrait utiliser entre autres return self::$count dans une méthode et $monObjet::$count.

Résumé

Si vous connaissez déjà les principes de la programmation orientée objet, ce n’est vraiment pas compliqué de l’utiliser en PHP. Avec PHP5, il y a plusieurs objets intégrés au lagage. Ils sont programmés en C ou en C++, ce qui les rend extrêmement rapides. Si vous avez besoin de fonctionnalités que ces objets possèdent, mais que vous avez besoin d’encore un peu plus, l’héritage vous permet de construire des classes très rapides tout en évitant de recoder des fonctionnalités qui sont déjà dans le langage.

3 commentaires

  1. Programmation orientée objet en PHP | PHP-Blog.com dit :
    30 novembre 2008 à 14:41

    [...] post:  Programmation orientée objet en PHP Related ArticlesBookmarksTags PHP PHP is a computer scripting language. Originally [...]

  2. darkis dit :
    16 décembre 2008 à 18:45

    Super ton article :)

  3. Antoine Leclair dit :
    16 décembre 2008 à 18:52

    Merci !

    J’ai jeté un coup d’oeil à ton blog, j’espère que tu vas poster davantage, on semble s’intéresser au même genre de choses.

Laisser un commentaire

« retourner à la page principale du blog