No, no puede "inicializar" o crear una instancia de la clase a través de un gancho, no directamente. Siempre se requiere algún código adicional (y no es algo deseable poder hacerlo, ya que estás abriendo una lata de gusanos para ti).
Aquí hay una mejor manera de hacerlo:
class MyClass {
function __construct() {
add_action( 'admin_init',array( $this, 'getStuffDone' ) );
}
function getStuffDone() {
// .. This is where stuff gets done ..
}
}
$var = new MyClass();
Por supuesto, uno podría crear una clase de interfaz para simplificarlo aún más para el caso general:
class IGetStuffDone {
function IGetStuffDone(){
add_action( 'admin_init',array( $this, 'getStuffDone' ) );
}
public abstract function getStuffDone();
}
Tenga en cuenta que, como interfaz, no puede crear un objeto de este tipo directamente, pero podría crear una subclase, lo que le permite decir:
class CDoingThings extends IGetStuffDone {
function getStuffDone(){
// doing things
}
}
$var = new CDoingThings();
Lo que luego agregaría automáticamente todos los ganchos, ¡solo necesitas definir qué se está haciendo exactamente en una subclase y luego crearlo!
En constructores
No agregaría un constructor como función de enlace, es una mala práctica y puede provocar muchos eventos inusuales. También en la mayoría de los idiomas, un constructor devuelve el objeto del que se crea una instancia, por lo que si su gancho necesita devolver algo como en un filtro, no devolverá la variable filtrada como desea, sino que devolverá el objeto de clase.
Llamar a un constructor o a un destructor es una práctica de programación muy, muy, muy mala, sin importar en qué lenguaje esté, y nunca debe hacerse.
Los constructores también deben construir objetos, para inicializarlos listos para usar, no para el trabajo real. El trabajo que debe realizar el objeto debe estar en una función separada.
Métodos de clase estáticos, y no es necesario instanciar / inicializar en absoluto
Si su método de clase es un método de clase estático, puede pasar el nombre de la clase entre comillas en lugar de $this
como se muestra a continuación:
class MyClass {
public static function getStuffDone() {
// .. This is where stuff gets done ..
}
}
add_action( 'admin_init', array('MyClass','getStuffDone' ) );
Cierres & PHP 5.3
Lamentablemente, no puedes evitar que la línea cree la nueva clase. La única otra solución para omitirlo involucraría el código de la placa de la caldera que aún tiene esa línea y requeriría PHP 5.3+, por ejemplo:
add_action('admin_init',function(){
$var = new MyClass();
$var->getStuffDone();
});
En qué punto también puede omitir la clase y simplemente usar una función:
add_action('admin_init',function(){
// do stuff
});
Pero tenga en cuenta que ahora ha introducido el espectro de funciones anónimas. No hay forma de eliminar la acción anterior usando remove_action
, y esto puede y causa un gran dolor para los desarrolladores que tienen que trabajar con el código de otras personas.
En Ampersands
Es posible que veas acciones utilizadas de esta forma:
add_action( &$this, 'getStuffDone' );
Esto es malo . &
se agregó nuevamente en PHP 4 cuando los objetos se pasaron como valores, no como referencias. PHP 4 tiene más de una década y no ha sido compatible con WordPress en mucho tiempo.
No hay ninguna razón para utilizar &this
al agregar enlaces y filtros, y eliminar la referencia no causará problemas, e incluso puede mejorar la compatibilidad con futuras versiones de PHP
Usa esto en su lugar:
add_action( $this, 'getStuffDone' );