C’est quoi $this?

Par Julien Maury 14 février 2014


Selon sa progression ou tout simplement par choix, on peut avoir envie de coder autrement pour WordPress.

Le titre de ce billet est un peu abusif mais c’est pour la blague (et tout le monde s’est bien marré n’est-ce pas?). Il y a deux manière de coder pour WP: en fonctionnel ou en POO.

Fonctionnel?

C’est la manière la plus répandue. Dans la blogosphère, dans les plugins, les thèmes, on peut la retrouver et on peut la présenter ainsi :

add_action('init', '_add_functionality_on_init');
function _add_functionality_on_init() {
// du code
}

Une fonction préfixée, hookée ici sur init. C’est assez pratique aussi d’un point de vue « vulgarisation ». Cela reste accessible au plus grand nombre. On a un seul type de fonction, des points d’accroche ou hameçons que sont les hooks et basta !

Cela n’a rien de mauvais ou moins bien en soi même si on va voir que la POO ou programmation objet apporte certains avantages.

Mais tout de même, si on prend les widgets, on est bien obligé de passer par des classes:

In technical terms: a WordPress Widget is a PHP object that echoes string data to STDOUT when its widget() method is called. It’s located in wp-includes/widgets.php

POO?

Le fait de coder en classes va amener un contexte à vos fonctions. Toutes les fonctions présentes à l’intérieur d’une classe vont pouvoir être nommée explicitement puisqu’encapsulée dans une classe.

Par exemple les widgets ont tous des fonctions update pour la mise à jour des données, form pour le formulaire en admin et widget pour l’affichage en front.

Pas de risque d’erreur fatale due à une double déclaration donc mais on ne le fait pas que pour ça. Cela permet de grouper logiquement les fonctions. Ainsi on aura une hiérarchie de petits fichiers avec une tendance au découpage. Telle classe pour telle fonctionnalité, un fichier core qui les appelles, etc.

C’est globalement plus pratique pour la maintenance, d’autant que les classes PHP permettent l’héritage :

class Mon_Widget extends WP_Widget {}

Héritage?

C’est un principe, on va dire de forme, en POO, on va faire hériter toutes les propriétés d’une classe à une autre via le fameux extends. Alors j’espère ne pas trop dire de bêtises mais on va gagner en efficacité. Par exemple, dans un plugin, on va faire des classes pour des élements de nature différentes mais tous ce qui nécessitera la même fonctionnalité comme un markup HTML précis pourra être hérité dans nos différentes classes.

L’exemple est volontairement simple mais c’est grosso modo ce qu’il y a à comprendre sur le sujet.

Et on peut enchaîner les combos, pas directement, mais de 1 en 1 :


class Mon_Widget extends WP_Widget {}
class Mon_Widget2 extends Mon_Widget {}
class Mon_Widget3 extends Mon_Widget2 {}

Fonctions public, private?

On peut voir ce genre de mot-clé dans les codes en POO. On précède les fonctions dans une classe avec public quand on veut les rendre accessibles à l’extérieur de la classe par exemple pour les autres développeurs :

$var = new MaClasse();
$var->method();

Par exemple, __construct() est une fonction public. On va y mettre tout ce qui doit être initialisé avant d’utiliser l’objet.

Par opposition, les fonctions privées restent dans leurs classes respectives.

On pourra trouver aussi protected donc on voit bien que le propos avec les fonctions privées et publiques concerne l’accès. Si cet accès n’est pas défini, PHP l’interprêtera comme public.

DisclaimerZ

Bon j’ai fait un tour très rapide, que les puristes et spécialistes ne me jettent pas la pierre. J’ai choisi cette classification car c’est ce qui saute aux yeux quand on explore le code de certains plugins et thèmes et que l’on ne sait pas à quoi cela correspond.

J’espère ne pas avoir dit de bêtise. Sinon vous criez bien fort :D.

Ce n’est pas un réquisitoire contre tous ceux qui n’utilisent pas ou peu la POO, ou alors je suis totalement maso !

Conclusion

Notre fameux $this fait toujours référence à notre objet lui-même. Et là en fait on a moins parlé de WordPress que de PHP 5. Pour résumer les avantages de la POO, on peut dire que si bien fait, le code y est :

  • simple
  • réutilisable
  • maintenable facilement
  • extensible
  • modulaire
  • plus lisible aussi paradoxal que cela puisse sembler à certains

Après tout dépend pourquoi on l’utilise mais à choisir, je lance le dé, il tombe sur « Face » donc je vais dire que c’est mieux de faire de la POO quoiqu’il arrive (#troll). Plus sérieusement, ça ne coûte pas plus cher.

Je dis cela parce qu’il y a tout un débat là-dessus avec les pour les contre, tout dépend de ce que vous faites j’ai envie de dire, après il y a certains enjeux qui varient selon le type de projet et la durabilité souhaité et puis il y a les habitudes du développeur.

Y a pas que PHP

PHP est essentiel pour maîtriser WordPress.

Mais qu’en est-il de HTML, CSS, AJAX, jQuery…etc ? Quand on fait des sites de A à Z, je regrette mais on doit maîtriser tout ça sinon on bricole, y a pas d’autre terme.

Si certains s’attachent à peaufiner leur PHP, et ils ont bien raison, il ne faut pas oublier les autres langages. On fait du web quoi ! Quand on jette un oeil à certains thèmes, c’est la foire au n’importe quoi, notamment au niveau jQuery et markup HTML, quant au CSS… c’est truffé de !important et de redondances.

#tips : un moyen simple pourtant de réduire la taille de la CSS est de définir des classes pour les tailles, les marges et les padding et de les appliquer directement dans le HTML. Cela permet aussi d’équilibrer le design. Rien qu’avec ça on réduit le compteur kilométrique dans la CSS.

J’admire ceux qui maîtrisent absolument tout. Si si, il y en a, mais beaucoup beaucoup moins en réalité que la masse de gens qui l’affirment. En ce qui me concerne, et c’est un minimum, je ne propose jamais de prestation pour lesquelles je n’ai pas les compétences sinon je conseille d’ajouter un prestataire ou d’aller voir ailleurs. Et bien ce minimum, certains n’en n’ont rien à foutre, croyez-moi.

Donc si je sais faire joujou avec Photoshop, faire des affiches, flyers tout ça tout ça, je ne suis pas designer par exemple donc je préfère nettement que l’on me donne la maquette à intégrer ou carrément développer sur une inté HTML/CSS.

Tweaker WP c’est cool mais ne pas oublier de faire des sites web au final ou alors se spécialiser.

Voilà, j’ai un fait une légère digression vers les métiers WP mais je pense que les 2 sujets sont liés.


7 commentaire(s)

  1. Cynthia dit :

    Alors, j'ai tout lu mais j'ai compris 1/4 de tout ce que tu dis ... Pas grave, je continuerai à te lire et peut-être même que petit à petit, moi aussi je deviendrai une As du code ! #Iwish ;-)
    (En fait, je n'ai pas compris grand chose mais c'est quand même agréable de te lire, comme l'a si bien dit Sylvain de TDM.)

  2. Julien Maury dit :

    Salut Cynthia, merci du compliment. C'est jamais grave de ne pas tout comprendre encore moins de le dire, enfin d'après ce que j'en dis.

    Tout est question d'échelle c'est pour ça que je n'aime pas trop les articles où les mecs se la racontent même s'ils sont bons, parce que t'es bon par rapport à d'autres.

    Mais peut-être que t'es mauvais par rapport à d'autres aussi... #maPhilosophieDuVendrediSoir

  3. Cynthia dit :

    Je n'ai effectivement pas honte de dire quand je ne comprends pas quelque chose. On apprend en se trompant, pas vrai ? :-)
    Ne change pas.

  4. Julien Maury dit :

    Bah si je vais changer, "hier c'est loin", mais on garde les fondamentaux :)

  5. Cynthia dit :

    Je disais que TOI tu ne dois pas changer :-) !

  6. jb dit :

    "Le fait de coder en classes va amener un contexte à vos fonctions."

    Attention à ne pas faire l'amalgame entre classes et POO. On peut faire de la POO sans utiliser de classes et utiliser des classes mais sans pour autant faire de la POO.

    Le système de classes permet juste de faciliter la programmation orientée objet mais tu peux très bien faire de l'objet dans un langage sans notion de classes (du C, de l'assembleur ou du JavaScript par exemples).

  7. Julien Maury dit :

    Merci jb pour ton commentaire. En fait ici je parle de PHP. Je débute en POO et oui tu as raison c'est mal dit. C'est que souvent dans nos plugins et thèmes on utilisera les deux.