Por que você precisa agrupar uma função dentro da matriz ($ this, function)

8

Sou iniciante em PHP e WordPress, por isso seja gentil!

Estou construindo um plugin - seguindo alguns tutoriais, fazendo tudo funcionar.

Minha pergunta é por que a função que eu quero chamar está encerrada no array($this, function)? Por exemplo, eu tenho esse código construtor dentro da minha classe

 function __construct() {
      add_action( 'admin_init',array( $this, 'getStuffDone' ) );
 }

A função getStuffDone é acionada OK - mas por que ela precisa estar no formato em que está?

Qualquer ideia é bem apreciada.

Simon
fonte
1
Eu não sei o suficiente sobre OOP para dar uma resposta informativa, mas algumas pesquisas dá algumas referências boas: Usando add_actioncom classe e PHP Passando para Funções
Howdy_McGee
Nunca registre retornos de chamada em construtores. Isso torna seu código não testável.
fuxia
@toscho para um exemplo de configuração de inicialização correta? Chamar uma função init () dedicada ou algo do construtor?
lkraav
@lkraav Veja a resposta do gmazzap para essa pergunta .
fuxia

Respostas:

6

É um retorno de chamada PHP . Você precisa da sintaxe para manter uma referência à instância da classe.

Coloque dessa maneira - se você não tinha $this, como o chamador sabe que esse getStuffDoneé um método da sua classe, e não apenas uma função PHP regular? Não faz.

Usando o array( $this, 'getStuffDone' )say para PHP:

Ei mano, você precisa chamar o método getStuffDonenesta instância da minha classe

TheDeadMedic
fonte
O que eu não entendo, que pode ser como eu estou lendo, mas a primeira frase em Passagem diz except language constructs such as: array(), mas aqui estamos passando uma matriz. Isso é um erro de digitação ou estou lendo a frase errada?
Howdy_McGee
Não, está certo, mas está se referindo a funções, não métodos. Leia o parágrafo diretamente abaixo.
TheDeadMedic
5

a definição da função add_action () se parece com:

 function add_action($tag, $function_to_add, $priority = 10, $accepted_args = 1) {
     return add_filter($tag, $function_to_add, $priority, $accepted_args);
 }

então, de acordo com o que parece esperado (string, string, int, int)

Em um arquivo php tradicional, o segundo parâmetro seria simplesmente um dos nomes de suas funções.

então você teria add_action('admin_init','my_init_function')

Parece que você está usando uma classe para encapsular seu plug-in. Outras classes podem ter funções com o mesmo nome ( getStuffDone ).

Portanto, sua função é conhecida apenas com referência à sua classe, é por isso que você precisa especificar sua classe $thise o nome da função.

Se você estiver tentando fazer referência a uma função dentro de uma classe, precisará usar a sintaxe de chamada da matriz

Veja também codex.wordpress.org

Loopo
fonte
1

Consulte a documentação, em " Notas contribuídas pelo usuário ":

"Para usar add_action() quando seu plug-in ou tema é criado usando classes , você precisa usar a sintaxe que pode ser chamada de matriz. Você passaria a função para add_action()uma matriz, com $thiso primeiro elemento e o nome do método de classe ..."

farzad
fonte