Pourquoi avez-vous besoin d'encapsuler une fonction dans un tableau ($ this, function)

8

Je suis novice en PHP et WordPress, alors soyez gentil!

Je construis un plugin - en suivant quelques tutoriels, pour que tout fonctionne.

Ma question est pourquoi la fonction que je veux appeler est-elle enveloppée dans le array($this, function)? Par exemple, j'ai ce code constructeur dans ma classe

 function __construct() {
      add_action( 'admin_init',array( $this, 'getStuffDone' ) );
 }

La fonction getStuffDone est déclenchée correctement - mais pourquoi doit-elle être dans le format dans lequel elle se trouve?

Tout aperçu est très apprécié.

Simon
la source
1
Je ne connais pas suffisamment la POO pour donner une réponse informative, mais certaines recherches donnent quelques bonnes références: Utilisation add_actionavec la classe et PHP Passage aux fonctions
Howdy_McGee
N'enregistrez jamais de rappels dans les constructeurs. Cela rend votre code non testable.
fuxia
@toscho lien vers un exemple de configuration d'initialisation correcte? Appelez une fonction init () dédiée ou quelque chose du constructeur?
lkraav
@lkraav Voir la réponse de gmazzap à cette question .
fuxia

Réponses:

6

C'est un rappel PHP . Vous avez besoin de la syntaxe pour conserver une référence à l'instance de classe.

Autrement dit - si vous ne l'avez pas fait $this, comment l'appelant sait-il que getStuffDonec'est une méthode de votre classe, et pas seulement une fonction PHP régulière? Ce n'est pas le cas.

Utiliser array( $this, 'getStuffDone' )dit à PHP:

Hé frère, tu dois appeler la méthode getStuffDonesur cette instance de ma classe

TheDeadMedic
la source
Ce que je ne comprends pas, c'est peut-être la façon dont je le lis, mais la première phrase sous Passage dit except language constructs such as: array(), mais ici nous passons un tableau. Est-ce une faute de frappe ou ai-je mal lu la phrase?
Howdy_McGee
Non c'est vrai, mais ça fait référence aux fonctions, pas aux méthodes. Lisez le para directement en dessous.
TheDeadMedic
5

la définition de la fonction add_action () ressemble à:

 function add_action($tag, $function_to_add, $priority = 10, $accepted_args = 1) {
     return add_filter($tag, $function_to_add, $priority, $accepted_args);
 }

donc selon ça on dirait qu'il attend (string, string, int, int)

Dans un fichier php traditionnel, le deuxième paramètre serait simplement l'un de vos noms de fonction.

vous auriez donc add_action('admin_init','my_init_function')

Il semble que vous utilisiez une classe pour encapsuler votre plugin. D'autres classes pourraient avoir des fonctions avec le même nom ( getStuffDone ).

Donc, votre fonction n'est connue que par référence à votre classe, c'est pourquoi vous devez spécifier votre classe $thisainsi que le nom de la fonction.

Si vous essayez de référencer une fonction à l'intérieur d'une classe, vous devez utiliser la syntaxe appelable tableau

Voir aussi codex.wordpress.org

Loopo
la source
1

Voir la documentation, sous les " Notes contributives des utilisateurs ":

"Pour l'utiliser add_action() lorsque votre plugin ou thème est construit en utilisant des classes , vous devez utiliser la syntaxe appelable du tableau. Vous passeriez la fonction à add_action()un tableau, avec $thiscomme premier élément, puis le nom de la méthode de classe ..."

farzad
la source