¿Por qué necesita ajustar una función dentro de la matriz ($ this, function)

8

Soy un novato en PHP y WordPress, ¡así que sé gentil!

Estoy construyendo un complemento, siguiendo algunos tutoriales y haciendo que todo funcione.

Mi pregunta es ¿por qué la función a la que quiero llamar está envuelta en array($this, function)? Por ejemplo, tengo este código de constructor dentro de mi clase

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

La función getStuffDone se activa OK, pero ¿por qué tiene que estar en el formato en que está?

Cualquier idea es muy apreciada.

Simón
fuente
1
No sé lo suficiente sobre OOP para dar una respuesta informativa, pero algunas investigaciones brindan algunas buenas referencias: Uso add_actioncon la clase y PHP Pasando a funciones
Howdy_McGee
Nunca registre devoluciones de llamada en constructores. Eso hace que su código sea inestable.
fuxia
@toscho enlace a un ejemplo de configuración de inicialización correcta? ¿Llamar a una función init () dedicada o algo del constructor?
lkraav
@lkraav Vea la respuesta de gmazzap a esa pregunta .
fuxia

Respuestas:

6

Es una devolución de llamada PHP . Necesita la sintaxis para mantener una referencia a la instancia de clase.

Dicho de esta manera: si no lo hizo $this, ¿cómo sabe la persona que llama que getStuffDonees un método de su clase y no solo una función PHP normal? No lo hace.

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

Hola hermano, debes llamar al método getStuffDoneen esta instancia de mi clase

TheDeadMedic
fuente
Lo que no entiendo, que puede ser cómo lo estoy leyendo, pero la primera oración debajo de Pasando dice except language constructs such as: array(), pero aquí estamos pasando una matriz. ¿Es esto un error tipográfico o estoy leyendo mal la oración?
Howdy_McGee
No, está bien, pero se refiere a funciones, no a métodos. Lea el párrafo directamente debajo de él.
TheDeadMedic
5

la definición de la función add_action () se ve así:

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

de acuerdo con eso parece que espera (string, string, int, int)

En un archivo php tradicional, el segundo parámetro sería simplemente uno de los nombres de sus funciones.

entonces tendrías add_action('admin_init','my_init_function')

Parece que estás usando una clase para encapsular tu complemento. Otras clases podrían tener funciones en ellas con el mismo nombre ( getStuffDone ).

Entonces, su función solo se conoce con referencia a su clase, es por eso que debe especificar su clase $thisy el nombre de la función.

Si intenta hacer referencia a una función dentro de una clase, debe usar la sintaxis invocable de matriz

Ver también codex.wordpress.org

Loopo
fuente
1

Consulte la documentación, en " Notas contribuidas por el usuario ":

"Para usar add_action() cuando su plugin o tema se construye usando clases , debe usar la sintaxis invocable de matriz. Debería pasar la función add_action()como una matriz, con $thisel primer elemento, luego el nombre del método de clase ..."

farzad
fuente