Não, você não pode 'inicializar' ou instanciar a classe através de um gancho, não diretamente. Sempre é necessário algum código adicional (e não é uma coisa desejável poder fazer isso, pois você está abrindo uma lata de worms para si mesmo.
Aqui está uma maneira melhor de fazer isso:
class MyClass {
function __construct() {
add_action( 'admin_init',array( $this, 'getStuffDone' ) );
}
function getStuffDone() {
// .. This is where stuff gets done ..
}
}
$var = new MyClass();
Obviamente, pode-se criar uma classe de interface para simplificá-la ainda mais no caso geral:
class IGetStuffDone {
function IGetStuffDone(){
add_action( 'admin_init',array( $this, 'getStuffDone' ) );
}
public abstract function getStuffDone();
}
Observe que, como interface, você não pode criar um objeto desse tipo diretamente, mas pode criar uma subclasse, permitindo dizer:
class CDoingThings extends IGetStuffDone {
function getStuffDone(){
// doing things
}
}
$var = new CDoingThings();
O que adicionaria automaticamente todos os ganchos, basta definir o que exatamente está sendo feito em uma subclasse e criá-lo!
Em construtores
Eu não adicionaria um construtor como uma função de gancho, é uma prática ruim e pode levar a muitos eventos incomuns. Também na maioria dos idiomas, um construtor retorna o objeto que está sendo instanciado; portanto, se seu gancho precisar retornar algo como um filtro, ele não retornará a variável filtrada como você deseja, mas retornará o objeto de classe.
Chamar um construtor ou destruidor é uma prática de programação muito, muito, muito ruim, independentemente do idioma em que você esteja, e nunca deve ser feito.
Os construtores também devem construir objetos, para inicializá-los prontos para uso, não para o trabalho real. O trabalho a ser realizado pelo objeto deve estar em uma função separada.
Métodos de classe estática e sem a necessidade de instanciar / inicializar
Se o seu método de classe é estático, você pode passar o nome da classe entre aspas, e não $this
como mostrado abaixo:
class MyClass {
public static function getStuffDone() {
// .. This is where stuff gets done ..
}
}
add_action( 'admin_init', array('MyClass','getStuffDone' ) );
Encerramentos e PHP 5.3
Infelizmente você não pode evitar a linha que cria a nova classe. A única outra solução para ignorá-lo envolveria o código da placa da caldeira que ainda possui essa linha e exigiria o PHP 5.3 ou superior, por exemplo:
add_action('admin_init',function(){
$var = new MyClass();
$var->getStuffDone();
});
Nesse ponto, você também pode pular a classe e apenas usar uma função:
add_action('admin_init',function(){
// do stuff
});
Mas lembre-se de que você introduziu o espectro de funções anônimas. Não há como remover a ação acima usando remove_action
, e isso pode e causa grandes problemas para os desenvolvedores que precisam trabalhar com o código de outras pessoas.
Em Ampersands
Você pode ver ações usadas assim:
array( &$this, 'getStuffDone' );
Isso é ruim . &
foi adicionado novamente no PHP 4 quando objetos eram passados como valores, não como referências. O PHP 4 tem mais de uma década e não é suportado pelo WordPress há muito tempo.
Não há razão para usar &this
ao adicionar ganchos e filtros, e remover a referência não causará problemas e pode até melhorar a compatibilidade com versões futuras do PHP
Use isto:
array( $this, 'getStuffDone' );