Usando classes em vez de funções globais em functions.php

11

Em muitos temas que vi (incluindo TwentyEleven) e nos exemplos que encontrei on-line, ao criar o arquivo functions.php para um tema, toda a funcionalidade é declarada em um escopo global. Para esclarecer, é assim que um arquivo típico de funções se parece:

function my_theme_do_foo() { // ... }

function my_theme_do_bar() { // ... }

add_action( 'foo_hook', 'my_theme_do_foo' );

Parece-me que as coisas poderiam ser "encapsuladas" um pouco melhor se uma aula fosse usada:

class MyTheme {
    function do_foo() { // ... }
    function do_bar() { // ... }
}

$my_theme = new MyTheme();

add_action( 'foo_hook', array( &$my_theme, 'do_foo' ) );

As vantagens da segunda abordagem (aos meus olhos humildes):

  • Nomes de funções mais curtos
  • Acesso a variáveis de instância (a maior vantagem da IMO)
  • Nenhuma função global

As desvantagens:

  • O nome de classe ainda pode causar conflitos
  • Não é tão claro para "personalizar" com um tema filho (teria que estender uma classe pai)
  • A maioria dos temas não foi assim, então você estaria contrariando a tendência

Eu provavelmente estou negligenciando algumas coisas, mas estou me perguntando por que não adotar a abordagem OOP? Parece um pouco "mais limpo" para mim, se alguma coisa. Talvez eu esteja enganado?

Sou relativamente novo no desenvolvimento de temas para WordPress, então me perdoe se isso for de conhecimento comum na comunidade WP :). Apenas tentando aprender porque as coisas são como são.

    
por Andy Adams 10.10.2011 / 20:40

1 resposta

9

Usar uma classe para encapsulamento é uma abordagem muito comum de vários desenvolvedores de plug-ins. Eu faço isso e acho mais limpo. Mas para plugins. Os temas são mais processuais por natureza.

Não fazemos isso para os temas padrão do WordPress, porque aumenta a barreira para a entrada. As funções são bem simples. Remover ações vinculadas a classes pode ser difícil (e potencialmente problemático em circunstâncias específicas).

Além disso, várias funções nos temas padrão são conectáveis. Estender uma classe e substituir os métodos é muito mais complicado do que apenas definir a função. E, embora dois aspectos diferentes do código possam substituir funções diferentes, não é possível estender dinamicamente as classes. Como você apontou, a necessidade de estender uma classe pai é definitivamente uma desvantagem.

Eu considerei fazer as opções de tema do Twenty Eleven codificarem uma classe, mas nunca cheguei a ela. Esse tipo de funcionalidade separada de plug-in parece ser um bom candidato para o encapsulamento.

    
por Andrew Nacin 10.10.2011 / 21:14