Perché è necessario racchiudere una funzione all'interno dell'array ($ this, function)


8

Sono un principiante in PHP e WordPress, quindi per favore sii gentile!

Sto creando un plug-in - seguendo alcuni tutorial, facendo funzionare tutto.

La mia domanda è: perché la funzione che voglio chiamare è racchiusa in array($this, function)? Ad esempio ho questo codice costruttore all'interno della mia classe

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

La funzione getStuffDone viene attivata correttamente, ma perché deve essere nel formato in cui si trova?

Qualsiasi intuizione è molto apprezzata.


1
Non so abbastanza su OOP per dare una risposta informativa, ma alcune ricerche forniscono alcuni buoni riferimenti: utilizzo add_actioncon Class e PHP Passing to Functions
Howdy_McGee

Non registrare mai richiamate nei costruttori. Ciò rende il tuo codice non testabile.
fuxia

@toscho collegamento a una configurazione di inizializzazione corretta di esempio? Chiamare una funzione init () dedicata o qualcosa del costruttore?
lkraav,

@lkraav Vedi la risposta di gmazzap a questa domanda .
fuxia

Risposte:


6

È un callback PHP . È necessaria la sintassi per mantenere un riferimento all'istanza della classe.

Detto in questo modo: se non lo hai fatto $this, come fa il chiamante a sapere che getStuffDoneè un metodo della tua classe e non solo una normale funzione PHP? Non

Utilizzando array( $this, 'getStuffDone' )dice a PHP:

Ehi fratello, devi chiamare il metodo getStuffDonesu questa istanza della mia classe


Quello che non capisco, che potrebbe essere il modo in cui lo sto leggendo, ma la prima frase in Passing dice except language constructs such as: array(), ma qui stiamo passando un array. È un refuso o sto leggendo la frase sbagliata?
Howdy_McGee

No, è giusto, ma si riferisce alle funzioni, non ai metodi. Leggi il paragrafo direttamente sotto di esso.
TheDeadMedic

5

la definizione della funzione add_action () è simile a:

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

quindi in base a ciò sembra che si aspetti (stringa, stringa, int, int)

In un file php tradizionale il secondo parametro sarebbe semplicemente uno dei nomi delle tue funzioni.

così avresti add_action('admin_init','my_init_function')

Sembra che tu stia usando una classe per incapsulare il tuo plugin. Altre classi potrebbero avere funzioni con lo stesso nome ( getStuffDone ).

Quindi la tua funzione è conosciuta solo con riferimento alla tua classe, ecco perché devi specificare la tua classe $thise il nome della funzione.

Se si sta tentando di fare riferimento a una funzione all'interno di una classe, è necessario utilizzare la sintassi richiamabile dell'array

Vedi anche codex.wordpress.org


1

Vedere la documentazione, in " Note fornite dall'utente ":

"Per utilizzare add_action() quando il plug-in o il tema viene creato utilizzando le classi , è necessario utilizzare la sintassi richiamabile dell'array. Passare la funzione a add_action()un array, con $thiscome primo elemento, quindi il nome del metodo di classe ..."

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.