No, no puede 'inicializar' o instanciar la clase a través de un gancho, no directamente. Siempre se requiere algún código adicional (y no es deseable poder hacerlo, ya que está abriendo una lata de gusanos para usted).
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 simplificarla 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 puede crear una subclase, 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 necesita definir qué se está haciendo exactamente en una subclase y luego crearlo!
En constructores
No agregaría un constructor como una función de enlace, es una mala práctica y puede provocar muchos eventos inusuales. Además, en la mayoría de los idiomas, un constructor devuelve el objeto que se está instanciando, por lo que si su gancho necesita devolver algo como en un filtro, no devolverá la variable filtrada que desee, sino que devolverá el objeto de clase.
Llamar a un constructor o un destructor es una muy, muy, muy mala práctica de programación, sin importar en qué idioma se encuentre, y nunca se debe hacer.
Los constructores también deben construir objetos, para inicializarlos listos para usar, no para el trabajo real. El trabajo a realizar por el objeto debe estar en una función separada.
Métodos de clase estática y sin necesidad de 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' ) );
Closures y PHP 5.3
Lamentablemente, no puede evitar la línea que crea la nueva clase. La única otra solución para omitirlo sería el código de placa de caldera que todavía tiene esa línea, y requeriría PHP 5.3+, por ejemplo:
add_action('admin_init',function(){
$var = new MyClass();
$var->getStuffDone();
});
En ese momento, también puede saltear 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 utilizando remove_action
, y esto puede causar un gran dolor a los desarrolladores que tienen que trabajar con el código de otras personas.
En los símbolos
Puede ver acciones utilizadas de esta manera:
array( &$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 usar &this
al agregar ganchos y filtros, y eliminar la referencia no causará problemas e incluso puede mejorar la compatibilidad con futuras versiones de PHP
Use esto en su lugar:
array( $this, 'getStuffDone' );