Usar clases en lugar de funciones globales en functions.php

11

En muchos temas que he visto (incluido TwentyEleven) y en los ejemplos que he encontrado en línea, al crear el archivo functions.php para un tema, toda la funcionalidad se declara en un ámbito global. Para aclarar, este es el aspecto de un archivo de funciones típico:

function my_theme_do_foo() { // ... }

function my_theme_do_bar() { // ... }

add_action( 'foo_hook', 'my_theme_do_foo' );

Me parece que las cosas podrían "encapsularse" un poco mejor si se usara una clase:

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

$my_theme = new MyTheme();

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

Las ventajas del segundo enfoque (en mis ojos humildes):

  • Nombres de funciones más cortos
  • Acceso a las variables de instancia (la mayor ventaja IMO)
  • No hay funciones globales

Las desventajas:

  • El nombre de clase todavía podría causar conflictos
  • No está tan claro como para "personalizarlo" con un tema secundario (tendría que extender una clase primaria)
  • La mayoría de los temas no lo han hecho de esta manera, por lo que estarías rompiendo con la tendencia

Probablemente estoy pasando por alto algunas cosas, pero me pregunto ¿por qué no tomar el enfoque OOP? Se siente un poco "más limpio" para mí, en todo caso. Tal vez estoy equivocado?

Soy bastante nuevo en el desarrollo de temas de WordPress, así que perdóneme si esto es de conocimiento común en la comunidad de WP :). Solo trato de aprender por qué las cosas son como son.

    
pregunta Andy Adams 10.10.2011 - 20:40

1 respuesta

9

El uso de una clase para la encapsulación es un enfoque muy común por parte de varios desarrolladores de complementos. Hago esto, y lo encuentro más limpio. Pero para los complementos. Los temas son más procesales por naturaleza.

No lo hacemos para los temas de WordPress predeterminados porque eleva la barrera de entrada. Las funciones son bastante simples. Eliminar acciones vinculadas a clases puede ser difícil (y potencialmente defectuoso en circunstancias específicas).

También se pueden conectar varias funciones en los temas predeterminados. Extender una clase y reemplazar los métodos es mucho más complicado que simplemente definir la función. Y mientras dos aspectos diferentes del código pueden reemplazar diferentes funciones, no se pueden extender clases dinámicamente. Como señalaste, la necesidad de extender una clase padre es definitivamente una desventaja.

Consideré que el código de opciones del tema de Twenty Eleven fuera una clase, pero nunca lo hice. Ese tipo de funcionalidad separada, parecida a un plugin, parece un buen candidato para la encapsulación.

    
respondido por el Andrew Nacin 10.10.2011 - 21:14

Lea otras preguntas en las etiquetas