Utiliser des classes au lieu de fonctions globales dans functions.php

11

Dans de nombreux thèmes que j'ai vus (y compris TwentyEleven) et dans les exemples que j'ai trouvés en ligne, lors de la construction du fichier functions.php pour un thème, toutes les fonctionnalités sont déclarées dans une étendue globale. Pour clarifier, voici à quoi ressemble un fichier de fonctions typique:

function my_theme_do_foo() { // ... }

function my_theme_do_bar() { // ... }

add_action( 'foo_hook', 'my_theme_do_foo' );

Il me semble que les choses pourraient être "encapsulées" un peu mieux si une classe était utilisée:

class MyTheme {
    function do_foo() { // ... }
    function do_bar() { // ... }
}

$my_theme = new MyTheme();

add_action( 'foo_hook', array( &$my_theme, 'do_foo' ) );

Les avantages de la deuxième approche (à mes humbles yeux):

  • Noms de fonction plus courts
  • Accès aux variables d'instance (le plus gros avantage, OMI)
  • Aucune fonction globale

Les inconvénients:

  • Le nom de classe peut toujours causer des conflits
  • Pas aussi évident de "personnaliser" avec un thème enfant (il faudrait étendre une classe parent)
  • La plupart des thèmes ne l'ont pas fait de cette façon, vous allez donc casser la tendance

Je passe probablement à côté de certaines choses, mais je me demande pourquoi ne pas adopter l'approche POO? C'est un peu "plus propre" pour moi, si tant est. Peut-être que je me trompe?

Je suis assez nouveau dans le développement de thèmes WordPress, alors pardonnez-moi si cela est de notoriété publique dans la communauté WP :). J'essaie juste d'apprendre pourquoi les choses sont comme elles sont.

    
posée Andy Adams 10.10.2011 - 20:40

1 réponse

9

L’utilisation d’une classe pour l’encapsulation est une approche très courante utilisée par plusieurs développeurs pour les plugins. Je le fais et je le trouve plus propre. Mais pour les plugins. Les thèmes sont davantage de nature procédurale.

Nous ne le faisons pas pour les thèmes WordPress par défaut, car cela soulève la barrière à l'entrée. Les fonctions sont assez simples. Supprimer des actions liées à des classes peut être difficile (et potentiellement bogué dans certaines circonstances).

De plus, un certain nombre de fonctions dans les thèmes par défaut sont connectables. L'extension d'une classe et le remplacement des méthodes sont beaucoup plus compliqués que la simple définition de la fonction. Et bien que deux aspects différents du code puissent remplacer des fonctions différentes, vous ne pouvez pas étendre de manière dynamique les classes. Comme vous l'avez souligné, la nécessité d'étendre une classe de parents est définitivement un inconvénient.

J'ai envisagé de transformer les options de thème de Twenty Eleven en classe, mais je n'y suis jamais parvenu. Ce type de fonctionnalité distincte, semblable à un plugin, semble être un bon candidat pour l’encapsulation.

    
réponse donnée Andrew Nacin 10.10.2011 - 21:14

Lire d'autres questions sur les étiquettes