PHP (POO) -Classes-

Dans un souci d’industrialisation, de modularité et de maintenabilité du code, la POO est devenu indispensable. Elle est apparue avec PHP 3 avant d’être profondément changée avec la sortie de PHP 5.

Classes

Une classe est un type composite. C’est un ensemble contenant des variables (attributs) et des fonctionnalités (méthodes) qui permettent de manipuler ces variables. Une classe est donc un modèle à partir duquel sont définis des objets (instances de classe).

<?php 
class Voiture {
 public $portes = array();
 public function getPortes() {
   return $this->portes;
 }
}
$voiture = new Voiture(); // un objet Voiture 
$chaine = 'Voiture';
$voiture2 = new $chaine(); // un autre objet voiture

La déclaration d’un attribut s’effectue avec un des mots-clés public, protected ou private, suivi de son nom. La valeur par défaut d’un attribut, si celle-ci n’est pas définie, est la valeur NULL

Une méthode est une déclaration classique de fonction PHP définie dans une classe et introduite par les mots-clés public, protected ou private.

Pour accéder à un attribut de la classe au sein d’une de ses méthodes, il est nécessaire de pourvoir référencer l’objet externe (qui sera ultérieurement créé) à partir de celui-ci. Cet objet est symbolisé par la variable $this. Cette variable n’est pas utilisable en dehors du contexte de la classe.

Visibilité

Une classe doit pouvoir protéger certaines de ses ressources et permettre l’accès à d’autres afin de pouvoir être manipulée par l’extérieur.

C’est pour cela qu’il est possible, au sein d’une classe, de déclarer les attributs et les méthodes avec trois niveaux de visibilité :

  • public : la ressource peut être manipulée par tous
  • protected : la ressource n’est pas accessible de l’extérieur de la classe, mais via la classe elle-même ou une de ses classes filles
  • private : la ressource n’est accessible que depuis la classe elle-même

Méthodes et attributs statiques

Un attribut (ou une méthode) statique est lié à la classe, il est unique et commun à tous les objets issus de cette classe. Toute modification effectuée sur un attribut statique d’une classe est donc répercutée sur l’ensemble des objets de celle-ci.

Pour accéder à un attribut statique, on utilise l’opérateur de résolution de portée (::), appelé en interne Paamayin Nekudotayim. Il est précédé du nom de la classe, ou, si on se trouve à l’intérieur de la classe, d’un des mots-clés self, parent ou static.

Exemple d’utilisation

<?php 
class Voiture { 
    private static $_compteur = 0; 
    public function getCompteur() {
      return self::$_compteur; 
    } 
    public static function creer() {
     self::$_compteur++; 
     return new self(); 
    } 
} 

$voiture1 = Voiture::creer(); 
echo $voiture1->getCompteur(); // affiche 1

$voiture2 = Voiture::creer();
echo $voiture2->getCompteur(); // affiche 2

Constantes 

Une classe peut posséder ses propres constantes que l’on appelle constantes de classe. Elles sont statiques, non modifiables et ont une visibilité publique. Il n’existe pas de constantes d’objets.

class Voiture {
  const M1 = 1;
  const M2 = 2;
  const M3 = 3;
}

Méthodes magiques

Les méthodes magiques permettent de créer des classes avec une souplesse d’utilisation de façon importante. On ne les appelle pas directement, ce sont des méthodes de classe événementielles qui répondent à des événements prédéfinis et appelés implicitement par PHP dès qu’un de ces événements survient, en considérant bien sur que la méthode magique correspondante a été préalablement définie dans la classe. Voici la liste des méthodes magiques

Exemples d’utilisation
Nous allons voir la méthode magique __invoke(), cette méthode est exécutée dès lors qu’on objet est appelé comme une fonction. Cela est utile pour passer un objet à une fonction nécessitant un callback par exemple.

<?php
class Factoriel {
    public function __invoke($num) {
        $result = 1;
        for($i = 2; $i<=$num ;$i++) {
            $result *= $i;
        }
        return $result;
    }
}

$obj = new Factoriel();
$a = array(1,2,3,4);
$b = array_map($obj,$a);

print_r($b);// Affiche : Array( [0] => 1 [1] => 2 [2] => 6 [3] => 24)

Dans cet exemple, une classe de callback est créée, permettant de calculer une factorielle.

Nous allons continuer dans un prochain article sur la notion d’héritage