Використання класів замість глобальних функцій у function.php


11

У багатьох темах, які я бачив (включаючи 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)
  • Ніяких глобальних функцій

Недоліки:

  • Ім'я класу все ще може викликати конфлікти
  • Не так зрозуміло, як "налаштувати" дочірню тему (доведеться розширити батьківський клас)
  • Більшість тем не зробили це так, тож ви б'єте в тренді

Я, мабуть, не помічаю деяких речей, але мені цікаво, чому б не застосувати підхід до ООП? Мені це здається трохи «чистішим», якщо що. Можливо, я помиляюся?

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


Ви можете перевірити теми від Ковшеніна - wordpress.org/extend/themes/profile/kovshenin він використовує підхід OOP у function.php
Mamaduka

Відповіді:


9

Використання класу для інкапсуляції - це дуже поширений підхід багатьох розробників для плагінів. Я це роблю, і я вважаю це чистішим. Але для плагінів. Теми мають більш процедурний характер.

Ми не робимо це за темами WordPress за замовчуванням, оскільки це створює перешкоду для входу. Функції досить прості. Видалення дій, прив'язаних до класів, може бути важким (а також потенційним помилкою в конкретних обставинах).

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

Я розглядав можливість тематичного варіанту теми двадцять одинадцять код, але ніколи не обійшов його. Цей окремий функціонал, подібний до плагінів, здається хорошим кандидатом для інкапсуляції.


Дякую за відповідь, Нацине. Я не замислювався над труднощами в «розв’язуванні» дій з класами. Щодо варіантів інкапсуляції - ми думали те саме: github.com/jestro/struts
Енді Адамс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.