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' );
$class
como seu nome de variável, essas palavras tendem a ser reservadas. Eu acho que você está saindo do seu caminho para evitar dizer algo semelhante$x = new Y();
no escopo global e está adicionando complexidade onde nada é necessário. Sua tentativa de reduzir a quantidade de código gravado envolveu escrever mais código!add_action( 'admin_init', array('MyNamespace\MyClass','getStuffDone' ) );
Classe de exemplo
Notas:
! class_exists
para evitar chamá-lo duas vezes e coloque o chamador init dentroinit
função e a classe varstatic
new self
.Aqui está um exemplo
Php 5+
Por favor , deixe de
&
fora. Já estamos além do php4. :)fonte
fonte
Você pode acionar eventos em sua classe sem a necessidade de carregá-lo inicialmente . Isso é útil se você não deseja carregar a classe completa antecipadamente, mas precisa acessar os filtros e ações do WordPress.
Aqui está um exemplo muito simples
Esta é uma versão muito simplificada da resposta de Kaiser, mas mostra em termos simples o comportamento. Pode ser útil para quem olha esse estilo pela primeira vez.
Outros métodos ainda podem iniciar o objeto, se necessário. Pessoalmente, estou usando esse método para permitir que partes opcionais do meu plug-in enfileirem scripts, mas apenas acionando o objeto em uma solicitação AJAX.
fonte
Isso funciona para mim:
fonte
De um modo geral, você não adicionaria uma classe inteira a um gancho. Os
add_action()
/add_filter()
hooks esperam funções de retorno de chamada , que podem ser referenciadas de dentro de uma classe .Digamos que você tenha uma
init()
função dentro da sua classe, que deseja conectar ao gancho do WordPressinit
.Faça sua
add_action()
ligação dentro da sua classe e identifique o retorno de chamada da seguinte forma:(Observação: estou supondo que sua classe esteja com espaço para nome adequado; caso contrário, certifique-se de colocar um espaço para nome em suas funções de retorno de chamada.)
fonte
init
(ou onde você precisar)?Você deve conseguir passar o nome da classe em vez do objeto instanciado:
(Em teoria, sua outra solução também deve funcionar
Não sei direito por que não. Talvez se você não ligar por referência?)
fonte
init
método estático . Veja wordpress.stackexchange.com/a/48093/14052