Apprendre la POO en PHP dès que possible!

PHP est tellement plus qu'un langage de script. C'est un langage à part entière capable de construire des applications très complexes. En exploitant toute la puissance de la programmation orientée objet, vous pouvez réduire le temps passé à coder et l'utiliser pour créer de meilleurs sites Web. Ce tutoriel vous montrera comment.




Qu'est-ce que la POO??

OOP signifie Oobjet Oriented Programming. La POO est un paradigme de programmation dans lequel vous créez des "objets" avec lesquels travailler. Ces objets peuvent ensuite être adaptés à vos besoins spécifiques, afin de servir différents types d'applications tout en conservant la même base de code. Très utile en effet.

Qu'est-ce qu'un objet?

Un objet est simplement une copie ou une instance d'une "classe". Une classe peut être définie comme une "boîte noire" à partir de laquelle nous créons nos objets et accédons à ses attributs (variables) et méthodes (fonctions). L’analogie la plus courante avec l’explication des classes et de la POO est la manière dont vous conduisez une voiture: vous avez essentiellement 2 ou 3 pédales, un levier de vitesse et un volant. Vous n'avez pas besoin (et très probablement pas envie) de savoir comment fonctionne la voiture lorsque vous appuyez sur les pédales. Vous voulez juste que votre voiture aille dans tous les sens, à gauche et à droite. Et OOP est précisément cela. Vous n'avez pas besoin de savoir comment fonctionnent les méthodes d'une classe (si vous ne les avez pas appliquées vous-même), mais ce qu'elles font. La POO est également utile si vous avez un grand nombre d'objets du même type dans un système: il vous suffit de créer les objets, puis de les manipuler tous de la même manière, sans réécrire le code. De plus, un objet est capable de conserver son état (valeurs variables et autres) tout au long de l'exécution du programme.


La mise en œuvre de "Car" nous est cachée, mais nous pouvons utiliser toutes ses capacités..

POO en PHP

PHP 5 (bien que la plupart des idées de cet article s’appliquent également à PHP 4) supporte parfaitement la programmation orientée objet en offrant une création de classe facile. PHP fournit tous les paradigmes d'autres "vrais" langages POO implémentés (Python et JAVA, par exemple), tels que l'héritage, le polymorphisme et l'encapsulation..

Héritage

L'idée de base derrière l'héritage est que des objets similaires partagent des propriétés communes. Donc, en créant une classe "générique", nous pouvons avoir un plan pour construire nos classes ultérieures. Imaginez, si vous voulez, les propriétés d'une voiture: couleur, nombre de roues, puissance, nombre de sièges, etc. Ce modèle nous permet de spécialiser nos voitures en élargissant cette classe: en créant une voiture de course dotée d'une propriété "nitro", ou un camion qui a une propriété "remorque". La ligne du bas est: créez une classe plus générique qui contient la plupart des attributs communs et vous aurez beaucoup moins de travail pour définir d’autres objets légèrement différents. Au lieu de réécrire tout le code, il vous suffit d'étendre ses propriétés, ce qui vous fait gagner beaucoup de temps..


Diagramme d'héritage pour nos classes de voitures.

Encapsulation

Comme expliqué précédemment, l’un des principaux avantages de l’utilisation d’objets est qu’il n’est pas nécessaire de révéler tous ses membres (attributs ou fonctions); juste les interfaces nécessaires pour travailler avec. Les détails non utiles à l'utilisation de ces objets doivent être masqués au reste des objets. C'est ce qu'on appelle l'encapsulation.

Niveaux de visibilité

  • Publique: signifie qu'un membre du groupe est visible et utilisable / modifiable par tout le monde
  • privé: signifie qu'un membre du groupe n'est utilisable / modifiable que par la classe elle-même
  • protégé: signifie qu'un membre de classe n'est utilisable / modifiable que par la classe elle-même et d'éventuelles sous-classes

NOTE: Par défaut, en PHP, un membre de la classe est public sauf s'il est déclaré privé ou protégé. Découvrez un exemple ici.

Polymorphisme

Le polymorphisme est une caractéristique de programmation orientée objet qui permet au programmeur d'attribuer une signification ou un usage différent à quelque chose dans différents contextes, en particulier pour permettre à un membre de la classe d'effectuer différentes tâches en fonction du contexte dans lequel il a été utilisé. Imaginez que vous ayez une classe Person et deux sous-classes de Person: japonais et américain. Les deux implémentent une fonction nommée talk (), mais avec des langages et un contexte social différents. Et bien que tous les deux soient fondamentalement des personnes (comme ils proviennent de la classe Person), leur implémentation de la fonction talk () est très différente. Donc vous avez essentiellement deux objets de la classe Person dans lesquels la fonction talk () fonctionne différemment.

Se salir les mains

Ok, maintenant pour l'action réelle. Nous allons créer une classe simple pour gérer la manipulation d'images et l'extraction d'informations. Pendant toute la durée de ce tutoriel, je suppose que vous avez une compréhension de base de PHP (variables, création de fonctions, utilisation d’instructions de flux de contrôle et de boucles). La lecture du manuel PHP de GD dissipera tous les doutes que vous pourriez avoir sur les fonctions de traitement des images..

Étape 1: Créer notre classe

Nous commençons par définir notre classe:

Cela indique simplement à PHP que nous allons commencer à définir une nouvelle classe, nommée "Image". Nous allons maintenant définir le constructeur de la classe. Un constructeur est simplement la fonction appelée lors de la création d'un nouvel objet. En PHP 5, cela peut être réalisé par deux méthodes différentes: créer une fonction publique avec exactement le même nom de la classe (PHP 4 et plus) ou en créant une fonction appelée "__construct ()" (PHP 5 uniquement):

Étape 2: Création du constructeur de classe

Les deux morceaux de code suivants font exactement la même chose:

NOTE: un constructeur de classe est toujours public.

Les constructeurs de classe doivent être utilisés pour garantir que l'objet créé dispose d'une quantité minimale de données avec laquelle travailler. dans notre cas, l'image souhaitée.

En tant que tel, la première chose à faire est de lire l'image, quel que soit son type. Actuellement, la bibliothèque GD prend en charge un certain nombre de types d'images, tels que jpg, png, gif, bmp et autres. il suffit de lire l'image et de déterminer son type.

Alors, qu'avons-nous fait? Pour ouvrir l'image le plus facilement possible, nous utiliserons la fonction imagecreatefromstring de GD (qui prend une chaîne binaire de données en entrée), au lieu de imagecreatefromjpeg, imagecreatefrompng ou imagecreatefromgif, par exemple.

Nous essayons donc d'ouvrir un fichier image et d'attribuer son pointeur de fichier à $ fp, et, en cas d'échec, mettre fin à l'exécution du programme.

$ fp = fopen ($ nom de fichier, 'rb') ou die ("Image '$ nom de fichier' non trouvé!");

Ensuite, nous créons une chaîne vide pour contenir nos données…

$ buf = ";

… Et lisez l'intégralité du fichier en concaténant les données lues avec le contenu de chaîne que nous venons de créer.

tandis que (! feof ($ fp)) $ buf. = fgets ($ fp, 4096);

Il ne nous reste plus qu'à créer notre image à l'aide des données que nous venons de lire…

imagecreatefromstring ($ buf);

… Et créer un objet pour utiliser toutes ces fonctions.

$ image = new Image ("image.png");

REMARQUE: Les fichiers jpg, png, gif et la plupart des fichiers image doivent être lus en mode binaire, d'où le "rb" passé en tant que second argument de la fonction fopen. "r" signifie lecture seule et "b" signifie binaire.

Étape 3: Définition des méthodes et des attributs de classe

Dans sa forme actuelle, notre classe n'est pas très utile. Nous allons donc ajouter des attributs et des méthodes pour le rendre plus utile. Nous allons donc commencer par 1: définir des variables internes (notez la déclaration de visibilité "privée" avant chaque variable)

image = imagecreatefromstring ($ buf); // extraire les informations sur l'image $ info = getimagesize ($ filename); $ this-> width = $ info [0]; $ this-> height = $ info [1]; $ this-> mimetype = $ info ['mime'];  $ image = new Image ("image.png"); // Si tout s'est bien passé, nous avons maintenant lu l'image?>

Et 2: une méthode pour afficher l'image.

mimetype "); switch ($ this-> mimetype) case 'image / jpeg': imagejpeg ($ this-> image); break; case 'image / png': imagepng ($ this-> image); break; case 'image / gif': imagegif ($ this-> image); break; // exit; $ image = new Image ($ _GET ['image']); // Si tout s'est bien passé, nous avons lu maintenant l'image?>

Dans cette étape, nous venons de créer des attributs de classe (image, largeur, hauteur et type MIME) pour contenir les données de l'objet. Nous avons ensuite apporté quelques modifications pour affecter l'image créée à notre attribut de classe. $ image

$ this-> image = imagecreatefromstring ($ buf)

… Et extrait les informations de l'image dans les variables de classe restantes (lisez la documentation sur getimagesize pour bien comprendre comment les informations de l'image sont lues):

// extraire les informations sur l'image $ info = getimagesize ($ filename); $ this-> width = $ info [0]; $ this-> height = $ info [1]; $ this-> mimetype = $ info ['mime'];

Ensuite, nous avons créé une fonction qui affiche l'image dans le navigateur en définissant les en-têtes appropriés (en savoir plus sur les en-têtes http) et en utilisant la fonction appropriée (avec l'instruction switch) pour générer l'image en fonction du type MIME de l'image d'origine (pour ce tutoriel. nous allons juste supporter jpg, png et gif mais, comme je l’ai déjà dit, GD supporte une multitude d’autres formats. Lisez la documentation php pour plus).

Alors, quel est ce "$ ce" truc là-dedans? "$ this", en PHP, fait référence à la classe elle-même et est utilisé pour pointer sur des attributs ou des fonctions de classe. En tant que tel, $ this-> image pointe sur l'attribut de classe nommé "$ image" et $ this-> image =… modifie la valeur de l'attribut de classe. Si vous deviez écrire $ image =… vous ne feriez que créer une nouvelle variable locale nommée "$ image", disponible exclusivement pour la durée de la fonction. C’est l’une des principales choses à prendre en compte lors de la création de classes en PHP.


Notre méthode d'affichage pas très utile (pour le moment!).

Étape 4: Définition de notre sous-classe "Vignettes"

Actuellement, notre classe n'est pas très utile. Bien sûr, nous pouvons lire notre image et l'afficher, mais c'est tout. Nous allons maintenant créer une sous-classe pour créer nos vignettes. (Nous n'avons pas vraiment besoin de créer une sous-classe, mais nous allons, pour le tutoriel, montrer l'héritage et le polymorphisme). Donc, pour que l'héritage fonctionne correctement, nous devons modifier légèrement la définition de notre super-classe (Image). Nous avons juste besoin de changer la visibilité de nos variables de classe de "privée" à "protégée". Et maintenant, nous allons créer le constructeur de notre sous-classe.

image, 0, 0, 0, 0, $ largeur, $ hauteur, $ ceci-> largeur, $ ceci-> hauteur); $ this-> image = $ thumb; ?>

Alors, que faisons-nous exactement ici? Nous avons créé une nouvelle classe, dérivée de notre classe d'origine, ce qui signifie que nous pouvons accéder à tous ses attributs et méthodes publics et protégés. Nous appelons le constructeur de super-classe, responsable de la lecture de l'image et de l'extraction de ses informations. Le constructeur de sous-classe n’appelle pas son constructeur de super-classe, nous devons donc l’appeler explicitement.

Maintenant, nous créons une nouvelle image pour notre vignette, avec la largeur et la hauteur passées:

$ thumb = imagecreatetruecolor ($ width, $ height);

Rééchantillonnez (redimensionnez) l'image d'origine dans la nouvelle pour créer la vignette:

imagecopyresampled ($ thumb, $ this-> image, 0, 0, 0, 0, $ width, $ height, $ this-> width, $ this-> height);

Et enfin, modifiez l’image originale pour qu'elle contienne la vignette au lieu de l’image pleine taille:

$ this-> image = $ thumb;

Et devine quoi? Nous n'avons pas vraiment besoin d'écrire une nouvelle fonction pour afficher la vignette car le même principe s'applique, que vous affichiez une image en taille réelle ou une vignette. Après tout, c'est toujours une image! Nous avons donc juste besoin d'appeler notre fonction display (), définie dans la super-classe, et nous avons terminé!


Notre classe complétée et sous-classe respective.

Et cela conclut notre tutoriel. À titre d'exercice, je vous suggère d'implémenter une fonction pour enregistrer les vignettes générées sur le disque au lieu de les afficher à la volée (Où devriez-vous implémenter cette fonction? Dans la super ou la sous-classe?). Bonne chance et vérifiez le zip fourni pour un exemple d'utilisation et les classes complètes développées ici (vous devez avoir un serveur PHP pour le tester).

  • Abonnez-vous au flux RSS NETTUTS pour plus de commentaires et d'articles sur le développement Web au quotidien.