Apprendre à coder sur pierre-giraud.com

DES COURS COMPLETS ET GRATUITS POUR TOUS

SOMMAIRE

Introduction

  1. Présentation du cours
  2. Introduction au PHP
  3. Mettre en place un env. de travail

Les bases en PHP

  1. Syntaxe de base du PHP
  2. Premières instructions PHP
  3. Introduction aux variables PHP
  4. Types de valeurs et concaténation
  5. Opérations sur les variables
  6. Conditions et opérateurs de comparaison
  7. Les conditions if, if...else et if... elseif... else
  8. Utilisation avancée des conditions
  9. Structures ternaires et switch
  10. Les boucles PHP
  11. Découverte des fonctions
  12. La portée des variables
  13. Les constantes PHP
  14. Les variables tableaux PHP
  15. Tableaux associatifs
  16. Tableaux multidimensionnels
  17. Test n°1

Gestion des dates en PHP

  1. Le timestamp
  2. Obtenir et formater une date
  3. Tester la validité d'une date
  4. Test n°2

Opérations sur les fichiers en PHP

  1. Lire, ouvrir, fermer un fichier
  2. Parcourir et lire un fichier par partie
  3. Créer un fichier et écrire dedans
  4. Ecrire dans un fichier
  5. Les instructions include et require
  6. Test n°3

Les variables superglobales

  1. Découverte des variables superglobales
  2. Les cookies
  3. Les sessions
  4. Test n°4

Les expressions régulières et PHP

  1. Découverte des regex
  2. Les fonctions PHP PCRE
  3. Quantifieurs et options
  4. Classes de caractères
  5. Test n°5

L'orienté objet en PHP

  1. Classes, instances et objets
  2. Propriétés et méthodes
  3. Extension de classe et héritage
  4. Le principe d'encapsulation
  5. La méthode constructeur
  6. L'opérateur de résolution de portée et la surcharge
  7. Constantes, méthodes et propriétés statiques
  8. Les classes et méthodes abstraites
  9. Les interfaces
  10. Les méthodes magiques
  11. Le chainage de méthodes
  12. Test n°6

Notions avancées en POO

  1. Le typage explicite
  2. Les traits
  3. Les closures et les classes anonymes
  4. L'auto-chargement des classes
  5. Le mot clef final
  6. Résolution statique à la volée
  7. Parcourir des objets
  8. Le clonage d'objets
  9. Comparaison d'objets
  10. Test n°7

Filtres, erreurs et exceptions

  1. Introduction aux filtres
  2. Utilisation pratique des filtres
  3. Gérer les erreurs en PHP
  4. Gérer les exceptions en PHP

L’OPERATEUR DE RESOLUTION DE PORTEE ET LA SURCHARGE DE METHODES ET DE PROPRIETES

L’opérateur de résolution de portée : définition et usage

L’opérateur de résolution de portée est symbolisé par le signe ::. Il va nous servir à accéder à des méthodes et des propriétés surchargées (c’est-à-dire modifiées par une classe fille). Nous allons également devoir utiliser cet opérateur pour manipuler les constantes et les méthodes et propriétés définies comme statiques.

Nous n’avons pas encore étudié les constantes et ni les méthodes et propriétés statiques. Pas d’inquiétude, nous allons le faire dès le prochain chapitre.

Pour le moment, concentrons-nous sur l’opérateur de résolution de portée et illustrons son fonctionnement dans le cas d’une méthode ou d’une propriété surchargée.

Surcharger des propriétés ou des méthodes en POO PHP

Surcharger une méthode ou une propriété signifie la redéfinir (c’est-à-dire réécrire une autre propriété ou méthode avec le même nom mais potentiellement une valeur ou un code différent).

Généralement, nous surchargerons des propriétés ou des méthodes d’une classe mère à partir d’une classe fille.

Reprenons nos deux classes Humain et Francais créées dans les chapitres précédents afin d’avoir un exemple concret.

Pour le moment, nous avons défini un constructeur pour notre classe parent Humain mais pas pour notre classe enfant Francais qui utilise donc par défaut le constructeur de son parent.

Le constructeur de notre classe Humain sert à définir le nom et la date d'inscription (ou de création) de nos objets.

Imaginons maintenant qu’on veuille que le nom des objets issus de la classe Francais soit stocké en majuscules. On va donc devoir définir un constructeur propre à notre classe enfant. De fait, nous allons donc surcharger le constructeur de notre classe parent Humain.

Voilà comment on s’y prendrait en réécrivant le tout :

Notre classe Humain et son constructeur en POO PHP

On définit un constructuer pour notre classe enfant Francais

On crée un objet en utilisant le constructeur de Francais

Chaque objet créé utilise le constructeur de sa classe

Ici, on se contente de définir un constructeur propre à notre classe Francais. Comme on veut que le nom de chaque nouvel objet créé à partir de cette classe soit transformé en majuscules, nous utilisons dans notre constructeur la méthode strtoupper() dont le rôle est rappelons le de transformer une chaîne de caractères en majuscules.

C'est une façon tout à fait valable de faire les choses. Le problème ici est qu'on a dû recopier le reste du code contenu dans le constructeur de notre parent pour pouvoir également afficher la date de création de l’objet.

En effet, à partir du moment où on définit un constructeur pour notre classe fille, le PHP ne va plus utiliser que ce constructeur lors de la création de nouveaux objets. Nous sommes donc obligés ici de réécrire tout le code du constructeur du parent que l'on souhaite également appliquer aux objets de la classe enfant.

Notez qu’à l’inverse nous n’avons pas besoin de redéfinir nos autres méthodes ou propriétés comme les méthodes et propriétés getNom() et $nom puisqu’en l’absence d’ambiguïté notre classe fille va en hériter automatiquement.

Revenons-en à notre constructeur. Ici, notre code n'est pas optimisé puisqu'on a dû réécrire une partie du constructeur de la classe parent dans notre classe enfant et rappelez vous qu'en tant que développeurs nous détestons écrire en trop et faire des efforts inutiles.

Ici, on voudrait donc récupérer directement la partie du constructeur du parent qui ne va pas changer pour le constructeur enfant. Pour cela, nous allons bien entendu utiliser notre opérateur de résolution de portée :: qui va nous servir à accéder au constructeur surchargé.

Utiliser l’opérateur de résolution de portée pour accéder à une méthode surchargée

On va pouvoir utiliser l’opérateur de résolution de portée pour accéder au contenu du constructeur de notre parent.

Pour cela, nous allons utiliser le mot clef parent suivi de l’opérateur de résolution de portée suivi du constructeur de notre parent comme ceci :

On utilise l'opérateur de résolution de portée pour accéder au constructeur surchargé de notre classe parent

On utilise le code du parent surchargé dans notre classe enfant

Notre objet utilise le code de son constructeur et celui du constructeur du parent en POO PHP

Ca peut sembler compliqué à première vue, mais ce qu’il se passe ici est en fait très simple.

Vous devez déjà bien comprendre qu'ici nous surchargeons la méthode __construct() de notre parent en définissant une méthode __construct() propre à notre classe enfant.

Ainsi, le PHP va par défaut n'utiliser que le code contenu dans le constructeur parent lorsqu'on crée un objet à partir de la classe parent et ne va utiliser que le code du constructeur enfant lorsqu'on crée un objet à partir de la classe enfant.

Le problème étant que nous aimerions récupérer la définition relative à la date de création d'un objet définie dans le parent et la définition du nom définie dans l'enfant lors de la création d'un objet Francais.

Pour cela, nous utilisons donc l'opérateur de résolution de portée pour accéder au constructeur surchargé de notre parent à partir du constructeur de notre enfant.

Cela a pour effet de récupérer le code du constructeur parent et donc la définition relative à la date de création d'un objet.

Ensuite, nous avons une ambiguïté sur la définition de la propriété $nom de nos objets puisqu'elle est définie d'une façon qui ne nous convient pas dans le constructeur de Humain. C'est bien pour cela qu'on surcharge à nouveau la définition relative au nom en la réécrivant comme on le souhaite dans le constructeur de notre enfant.

Ici, faire tout cela peut sembler inutile car nous ne récupérons au final qu'une seule ligne de code du constructeur parent. Cependant, pensez que parfois vous aurez des constructeurs très gros et dans ces cas là il pourra être très judicieux de récupérer certaines parties du constructeur d'un parent surchargé en utilisant l'opérateur de résolution de portée.

Chapitre précédent

Chapitre suivant