Warum müssen Sie eine Funktion in ein Array einschließen ($ this, function)

8

Ich bin ein Neuling bei PHP und WordPress, also sei bitte sanft!

Ich baue ein Plugin - folge ein paar Tutorials, damit alles funktioniert.

Meine Frage ist, warum die Funktion, die ich aufrufen möchte, in der Funktion eingeschlossen ist array($this, function). Zum Beispiel habe ich diesen Konstruktorcode in meiner Klasse

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

Die Funktion getStuffDone wird OK ausgelöst - aber warum muss sie das Format haben, in dem sie vorliegt?

Jeder Einblick wird sehr geschätzt.

Simon
quelle
1
Ich weiß nicht genug über OOP, um eine informative Antwort zu geben, aber einige Untersuchungen geben einige gute Referenzen: Verwenden add_actionmit Klasse und PHP
Übergabe
Registrieren Sie niemals Rückrufe in Konstruktoren. Das macht Ihren Code nicht testbar.
Fuxia
@toscho Link zu einem Beispiel für die korrekte Initialisierung? Eine dedizierte init () - Funktion oder etwas vom Konstruktor aufrufen?
lkraav
@lkraav Siehe gmazzaps Antwort auf diese Frage .
Fuxia

Antworten:

6

Es ist ein PHP-Rückruf . Sie benötigen die Syntax, um einen Verweis auf die Klasseninstanz beizubehalten.

Sagen wir es so - wenn nicht $this, woher weiß der Anrufer, dass dies getStuffDoneeine Methode Ihrer Klasse ist und nicht nur eine reguläre PHP-Funktion? Das tut es nicht.

Verwenden array( $this, 'getStuffDone' )sagt zu PHP:

Hey Bruder, du musst die Methode getStuffDonefür diese Instanz meiner Klasse aufrufen

TheDeadMedic
quelle
Was ich nicht verstehe, wie ich es vielleicht lese, sagt der erste Satz unter Übergebenexcept language constructs such as: array() , aber hier übergeben wir ein Array. Ist das ein Tippfehler oder lese ich den Satz falsch?
Howdy_McGee
Nein, es ist richtig, aber es bezieht sich auf Funktionen, nicht auf Methoden. Lesen Sie den Absatz direkt darunter.
TheDeadMedic
5

Die Funktionsdefinition von add_action () sieht folgendermaßen aus:

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

demnach sieht es so aus, als würde es erwartet (string, string, int, int)

In einer herkömmlichen PHP-Datei wäre der zweite Parameter einfach einer Ihrer Funktionsnamen.

so hättest du add_action('admin_init','my_init_function')

Es sieht so aus, als würden Sie eine Klasse verwenden, um Ihr Plugin zu kapseln. Andere Klassen können Funktionen mit demselben Namen enthalten ( getStuffDone ).

Ihre Funktion ist also nur unter Bezugnahme auf Ihre Klasse bekannt. Deshalb müssen Sie Ihre Klasse $thissowie den Funktionsnamen angeben .

Wenn Sie versuchen, auf eine Funktion innerhalb einer Klasse zu verweisen, müssen Sie eine aufrufbare Array-Syntax verwenden

Siehe auch codex.wordpress.org

Loopo
quelle
1

Siehe die Dokumentation unter " Vom Benutzer beigesteuerte Hinweise ":

"Um zu verwenden, add_action() wenn Ihr Plugin oder Theme mit Klassen erstellt wird , müssen Sie die aufrufbare Syntax des Arrays verwenden. Sie würden die Funktion add_action()als Array übergeben, mit $thisals erstem Element, dann mit dem Namen der Klassenmethode ..."

Farzad
quelle