No, non è possibile "inizializzare" o creare un'istanza della classe tramite un hook, non direttamente. È sempre necessario un codice aggiuntivo (e non è una cosa desiderabile poterlo fare, poiché stai aprendo una lattina di worm per te stesso.
Ecco un modo migliore per farlo:
class MyClass {
function __construct() {
add_action( 'admin_init',array( $this, 'getStuffDone' ) );
}
function getStuffDone() {
// .. This is where stuff gets done ..
}
}
$var = new MyClass();
Naturalmente si potrebbe creare una classe di interfaccia per semplificarla ulteriormente per il caso generale:
class IGetStuffDone {
function IGetStuffDone(){
add_action( 'admin_init',array( $this, 'getStuffDone' ) );
}
public abstract function getStuffDone();
}
Si noti che come interfaccia, non è possibile creare direttamente un oggetto di questo tipo, ma è possibile creare una sottoclasse, che consente di dire:
class CDoingThings extends IGetStuffDone {
function getStuffDone(){
// doing things
}
}
$var = new CDoingThings();
Che quindi aggiungerebbe automaticamente tutti gli hook, devi solo definire cosa si sta facendo esattamente in una sottoclasse e quindi crearlo!
Sui costruttori
Non aggiungerei un costruttore come funzione hook, è una cattiva pratica e può condurre molti altri eventi insoliti. Inoltre nella maggior parte delle lingue un costruttore restituisce l'oggetto che viene istanziato, quindi se il tuo hook deve restituire qualcosa come un filtro, non restituirà la variabile filtrata come desideri, ma restituirà invece l'oggetto della classe.
Chiamare un costruttore o un distruttore è una pratica di programmazione molto, molto, pessima, indipendentemente dal linguaggio in cui ti trovi, e non dovrebbe mai essere fatto.
I costruttori dovrebbero anche costruire oggetti, per inizializzarli pronti per l'uso, non per il lavoro effettivo. Il lavoro che deve essere svolto dall'oggetto dovrebbe essere in una funzione separata.
Metodi di classe statici e non è necessario creare un'istanza / inizializzazione
Se il tuo metodo di classe è un metodo di classe statico, puoi passare il nome della classe tra virgolette anziché $this
come mostrato di seguito:
class MyClass {
public static function getStuffDone() {
// .. This is where stuff gets done ..
}
}
add_action( 'admin_init', array('MyClass','getStuffDone' ) );
Chiusure e PHP 5.3
Purtroppo non puoi evitare la linea che crea la nuova classe. L'unica altra soluzione per saltarla riguarderebbe il codice della piastra della caldaia che ha ancora quella linea e richiederebbe PHP 5.3+, ad esempio:
add_action('admin_init',function(){
$var = new MyClass();
$var->getStuffDone();
});
A quel punto puoi anche saltare la classe e usare solo una funzione:
add_action('admin_init',function(){
// do stuff
});
Ma tieni presente che ora hai introdotto lo spettro di funzioni anonime. Non è possibile rimuovere l'azione sopra descritta remove_action
e ciò può causare problemi agli sviluppatori che devono lavorare con il codice di altre persone.
Su e commerciali
Potresti vedere azioni usate in questo modo:
array( &$this, 'getStuffDone' );
Questo è male . &
è stato aggiunto in PHP 4 quando gli oggetti sono stati passati come valori, non come riferimenti. PHP 4 ha più di un decennio e non è supportato da WordPress da molto tempo.
Non vi è motivo di utilizzare &this
quando si aggiungono hook e filtri e la rimozione del riferimento non causerà problemi e potrebbe persino migliorare la compatibilità con le versioni future di PHP
Usa questo invece:
array( $this, 'getStuffDone' );