– La programmation objet en PHP –

PHP est un langage que l’on peut utiliser soit en mode procédural, comme nous avons vu précédemment, soit en mode objet, soit en mixte. Déjà, avant toute chose reprenons vite fait le terme de l’objet.

Les objets

Un objet est une définition de briques logicielles représentant un concept, une idée ou une entité ainsi que leurs interactions. Un objet est une structure de données comprenant également les fonctionnalités de traitement des données (attributs) qui le composent. Il est vu au travers de ses spécifications.

Les concepts associés sont :

  • Encapsulation
  • Héritage
  • Polymorphisme

Les classes

Une classe définit un modèle à partir duquel tous les objets de la classe seront créés. Ell décrit les données internes ainsi que les fonctionnalités des objets

En gros elle représente une vision inerte visant à décrire la structure et le comportement des objets qui seront créés. La construction d’un objet à partir de la classe génératrice s’appelle instanciation, et les objets, entités « vivantes » en mémoire, sont des instances de la classe.

Instanciation/Encapsulation

Les objets doivent être instanciés à partir de la classe génératrice pour exister et devenir fonctionnels.

Exemple : la classe Animal

$bambi = new Animal() ;
$scrat = new Animal() ;

L’encapsulation est un procédé consistant à rassembler les données et les traitements au sein des objets. L’implémentation interne des objets est cachée et les objets sont vus à travers leurs spécifications. Les données internes et les fonctionnalités possèdent un niveau de visibilité et peuvent éventuellement être masquées :

  • Public
  • Privé
  • Protégé

Les données internes des objets sont appelées attributs (ou propriétés voire champs). Les fonctionnalités des objets sont appelées méthodes.

On peut définir tout type de méthodes, mais la quasi majorité des classes possède certaines méthodes habituelles :

  • Constructeur / destructeur
  • Accesseurs / modificateurs (getters / setters)

La référence à l’objet courant dans la description de la classe est modélisée par $this

Il y a 3 types de visibilité:

  • Publique : Les données internes et les méthodes sont accessibles par tous
  • Protégé : Les données internes et les méthodes sont accessibles aux objets dérivés
  • Privé : Les données internes et les méthodes ne sont accessibles qu’aux objets de la classe

Quelques fonctions sur les classes

get_declared_classes(): retourne un tableau listant toutes les classes définies

class_exists($str): vérifie qu’une classe dont le nom est passé en argument a été définie

get_class($obj), get_parent_class: retournent le nom de la classe de l’objet $obj

get_class_methods($str): retourne les noms des méthodes de la classe $str dans un tableau

get_class_vars($str): retourne les valeurs par défaut des attributs de la classe $str dans un tableau associatif

get_object_vars($obj): retourne un tableau associatif des attributs de l’objet $obj les clés sont les noms des attributs et les valeurs, celles des attributs si elles existent

is_subclass_of($obj,$str): détermine si l’objet $obj est une instanciation d’une sous-classe de $str, retourne VRAI ou FAUX

method_exists($obj,$str): vérifie que la méthode $str existe pour une classe dont $obj est une instance, retourne VRAI ou FAUX

Héritage et polymorphisme

Cela correspond à la création de nouvelles classes à partir du modèle d’une classe existante. La nouvelle classe possède tous les attributs et méthodes de la classe mère. La nouvelle classe peut proposer de nouveaux attributs et de nouvelles méthodes ou spécialiser des méthodes de la classe mère.

Le polymorphisme est la possibilité de choisir dynamiquement la méthode qui correspond au type réel de l’objet.

Imaginons pour toutes nos classes ci-contre une méthode mange(). Par exemple un Impala mange de l’herbe, un Carnivore mange de la viande. Les 2 classes sont des sous-classes de Mammifères.

function nourriture(Mammifere $m) {
        return $m->mange() ;
}

$i = new Impala() ; nourriture($i) ;

$c = new Carnivore() ; nourriture($c) ;

Exercice

Vous êtes le tout nouveau gérant du kébab le plus réputé d’Aurillac et vous devez gérer vos multiples commandes. Vous démarrez juste dans le commerce, donc vous ne vendez que 2 kébabs – américain, buffalo(avec œuf il paraît)

Créez une classe commande pour gérer les commandes de kébabs que vous avez, en sachant que vous ne faites que 2 types de kébabs.

Indices:

Attributs:

  • prixAmericain
  • prixBuffalo
  • nomClient
  • listeKebabs

Méthodes:

  • addKebab
  • removeKebab
  • calculerPrix
  • afficherCommande