it-swarm.xyz

Использование классов вместо глобальных функций в functions.php

Во многих темах, которые я видел (включая TwentyEleven) и в примерах, которые я нашел в Интернете, при создании файла functions.php для темы вся функциональность объявляется в глобальной области видимости. Чтобы уточнить, вот как выглядит типичный файл функций:

function my_theme_do_foo() { // ... }

function my_theme_do_bar() { // ... }

add_action( 'foo_hook', 'my_theme_do_foo' );

Мне кажется, что вещи могли бы быть "инкапсулированы" немного лучше, если бы использовался класс:

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

$my_theme = new MyTheme();

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

Преимущества второго подхода (на мой скромный взгляд):

  • Более короткие имена функций
  • Доступ к переменным экземпляра (самое большое преимущество IMO)
  • Нет глобальных функций

Недостатки:

  • Имя класса все еще может вызывать конфликты
  • Не так ясно, чтобы "настроить" с дочерней темой (придется расширить родительский класс)
  • Большинство тем не сделали это таким образом, так что вы бы противостоять тенденции

Я, наверное, упускаю из виду некоторые вещи, но мне интересно, почему бы не воспользоваться подходом OOP? Это чувствует себя немного "чище" для меня, если что-нибудь. Возможно я ошибаюсь?

Я довольно новичок в разработке тем WordPress, так что извините, если это общеизвестно в сообществе WP :). Просто пытаюсь понять, почему вещи такие, какие они есть.

11
Andy Adams

Использование класса для инкапсуляции является очень распространенным подходом многих разработчиков для плагинов. Я делаю это, и я нахожу это чище. Но для плагинов. Темы носят более процедурный характер.

Мы не делаем это для стандартных тем WordPress, потому что это повышает барьер для входа. Функции довольно просты. Удаление действий, связанных с классами, может быть затруднено (и может привести к ошибкам в определенных обстоятельствах).

Кроме того, ряд функций в темах по умолчанию являются подключаемыми. Расширение класса и замена методов намного сложнее, чем просто определение функции. И хотя два разных аспекта кода могут заменять разные функции, вы не можете динамически расширять классы. Как вы указали, необходимость расширения родительского класса определенно является недостатком.

Я подумывал о том, чтобы сделать код темы опций Twenty Eleven классом, но так и не смог обойти его. Такая отдельная, подобная плагину функциональность кажется хорошим кандидатом для инкапсуляции.

9
Andrew Nacin