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' );
$class
como su nombre de variable, esas palabras tienden a estar reservadas. Creo que está haciendo todo lo posible para evitar decir algo similar al$x = new Y();
alcance global, y está agregando complejidad donde no es necesario. ¡Su intento de reducir la cantidad de código escrito ha implicado escribir más código!add_action( 'admin_init', array('MyNamespace\MyClass','getStuffDone' ) );
Clase de ejemplo
Notas:
! class_exists
para evitar llamarla dos veces y coloque la llamada de inicio dentroinit
función y la clase varstatic
new self
.Aquí hay un ejemplo
Php 5+
Por favor , deja
&
afuera. Ya estamos más allá de php4. :)fuente
fuente
Puede activar eventos en su clase sin la necesidad de cargarlo inicialmente . Esto es útil si no desea cargar toda la clase por adelantado, pero necesita acceder a los filtros y acciones de WordPress.
Aquí hay un ejemplo muy simple
Esta es una versión muy simplificada de la respuesta de Kaiser, pero muestra en términos simples el comportamiento. Puede ser útil para aquellos que buscan este estilo por primera vez.
Otros métodos aún pueden iniciar el objeto si es necesario. Personalmente estoy usando este método para permitir que partes opcionales de mi complemento pongan en cola los scripts, pero solo desencadenar el objeto en una solicitud AJAX.
fuente
Esto funciona para mi:
fuente
En términos generales, no agregaría una clase completa a un gancho. Los
add_action()
/add_filter()
hooks esperan funciones de devolución de llamada , a las que se puede hacer referencia desde dentro de una clase .Digamos que tiene una
init()
función dentro de su clase, que desea conectar al gancho de WordPressinit
.Ponga su
add_action()
llamada dentro de su clase, y luego identifique la devolución de llamada de esta manera:(Nota: supongo que su clase tiene un espacio de nombres adecuado; de lo contrario, asegúrese de asignar un espacio de nombres a sus funciones de devolución de llamada).
fuente
init
(o donde lo necesite)?Debería poder hacerlo pasando el nombre de la clase en lugar del objeto instanciado:
(En teoría, su otra solución también debería funcionar
No estoy seguro de por qué no lo hace. ¿Tal vez si no llama por referencia?)
fuente
init
método estático . Ver wordpress.stackexchange.com/a/48093/14052