Connaissez-vous les différentes manières d’utiliser une fonction callback (ou fonction de rappel en bon français) en paramètre de la fonction usort

Tout le monde connaît la méthode la plus simple qui consiste à donner en paramètre le nom d’une fonction globale, comme montré dans l’exemple suivant:

1
2
3
4
5
function maFonctionCallbackUsort( $a, $b ) {
  return strcmp( $a, $b );
}

usort( $monTableau, 'maFonctionCallbackUsort' );

Un bon petit bout de code qui fait ce qu’on lui demande: il compare deux éléments du tableau et renvoie un résultat indiquant lequel des deux éléments est plus grand que l’autre…

Le problème avec ce morceau de code, c’est qu’on pollue l’espace global de notre application avec une fonction qui ne sera utilisée que pour notre appel à la fonction usort. Ce serait quand-même bien de pouvoir utiliser notre fonction usort dans une classe par exemple, avec une fonction callback privée qui ne serait pas accessible en dehors de la-dite classe (histoire d’éviter justement cette pollution de l’espace global).

Un rapide coup d’oeil dans la documentation de PHP nous donne toutes les informations nécessaires quant aux différentes syntaxes possibles.

Voyons les différentes possibilités offertes par le langage PHP:

  • L’appel d’une méthode statique d’une classe:
1
2
3
4
5
6
7
class MyClass {
    static function myCallbackMethod( $a, $b ) {
        return strcmp( $a, $b );
    }
}

usort( $monTableau, array( 'MyClass', 'myCallbackMethod' ) );
  • L’appel d’une méthode publique d’un objet:
1
2
3
4
5
6
7
8
class MyClass {
    public function myCallbackMethod( $a, $b ) {
        return strcmp( $a, $b );
    }
}

$obj = new MyClass();
usort( array( $obj, 'myCallbackMethod' ) );
  • Cette syntaxe pour l’appel d’une méthode statique d’une classe n’est possible que depuis la version 5.2.3 de PHP:
1
2
3
4
5
6
7
class MyClass {
    static function myCallbackMethod( $a, $b ) {
        return strcmp( $a, $b );
    }
}

usort( $monTableau, "MyClass::myCallbackMethod" );
  • Utilisation de la fonction usort dans une classe avec un appel à une méthode privée:
1
2
3
4
5
6
7
8
class MyClass {
   private function myCallbackMethod( $a, $b ) {
        return strcmp( $a, $b );
    }
   public function aa() {
      usort( $monTableau, array( $this, 'myCallbackMethod' ) );
   }
}
  • Alors ça c’est vraiment cool:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A {
    public static function myCallbackMethod( $a, $b ) {
        return strcmp( $a['lastname'], $b['lastname'] );
    }
}

    class B extends A {
    public static function myCallbackMethod( $a, $b ) {
        return strcmp( $a['firstname'], $b['firstname'] );
    }
}

// Les éléments du tableau sont triés par le champ `lastname`
usort( $monTableau, array( 'B', 'parent::myCallbackMethod' ) );

Voilà! Je pense que nous avons fait le tour de la question. Un sujet somme toute relativement intéressant.

Et juste pour la petite histoire, c’est une syntaxe que j’utilise énormément lorsque je développe un plugin pour Wordpress… Un petit exemple rapide vaut mieux qu’un long discours (pas forcément vrai dans le cas du SEO mais ça ce sera pour une prochaine fois!):

1
2
3
4
5
6
7
8
9
10
class My_WP_Plugin {
    public function __construct() {
        add_action( 'admin_init', array( &$this, 'actionAdminInit' ) );
    }

    public function actionAdminInit() {
        wp_enqueue_script( ... );
        // et plein d'autres choses encore !
    }
}

Pour info, c’est en lisant cette question sur Stackoverflow que je me suis intéressé au sujet.

Quelques nouvelles

Bien…. Ca fait plus de 5 mois que je n’ai plus rien posté sur ce blog, la honte! Pourtant les idées se bousculent au portillon…## Ce qu …… Continuer la lecture