Sử dụng các lớp thay vì các hàm toàn cục trong hàm.php


11

Trong nhiều chủ đề tôi đã thấy (bao gồm TwentyEleven) và trong các ví dụ tôi đã tìm thấy trực tuyến, khi xây dựng functions.phptệp cho một chủ đề, tất cả chức năng được khai báo trong phạm vi toàn cầu. Để làm rõ, đây là một tệp chức năng điển hình trông như thế nào:

function my_theme_do_foo() { // ... }

function my_theme_do_bar() { // ... }

add_action( 'foo_hook', 'my_theme_do_foo' );

Dường như với tôi rằng mọi thứ có thể được "gói gọn" tốt hơn một chút nếu một lớp được sử dụng:

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

$my_theme = new MyTheme();

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

Những lợi thế của cách tiếp cận thứ hai (trong mắt khiêm tốn của tôi):

  • Tên hàm ngắn hơn
  • Truy cập vào các biến thể hiện (lợi thế lớn nhất IMO)
  • Không có chức năng toàn cầu

Những nhược điểm:

  • Tên lớp vẫn có thể gây ra xung đột
  • Không rõ ràng để "tùy chỉnh" với một chủ đề con (sẽ phải mở rộng một lớp cha)
  • Hầu hết các chủ đề không được thực hiện theo cách này, vì vậy bạn sẽ nắm bắt xu hướng

Có lẽ tôi đang xem xét một số thứ, nhưng tôi tự hỏi tại sao không thực hiện phương pháp OOP? Nó cảm thấy một chút "sạch" hơn đối với tôi, nếu có bất cứ điều gì. Có lẽ tôi đã nhầm?

Tôi còn khá mới đối với phát triển chủ đề WordPress, vì vậy hãy tha thứ cho tôi nếu đây là kiến ​​thức phổ biến trong cộng đồng WP :). Chỉ cần cố gắng để tìm hiểu tại sao mọi thứ là như vậy.


Bạn có thể kiểm tra các chủ đề từ Kovshenin - wordpress.org/extend/theme/profile/kovshenin anh ấy sử dụng phương pháp OOP trong các
hàm.php

Câu trả lời:


9

Sử dụng một lớp để đóng gói là một cách tiếp cận rất phổ biến của một số nhà phát triển cho các plugin. Tôi làm điều này, và tôi thấy nó sạch hơn. Nhưng đối với các plugin. Chủ đề mang tính thủ tục hơn.

Chúng tôi không làm điều đó cho các chủ đề mặc định của WordPress vì nó làm tăng rào cản gia nhập. Các chức năng khá đơn giản. Loại bỏ các hành động gắn liền với các lớp có thể khó khăn (và có khả năng có lỗi trong các trường hợp cụ thể).

Ngoài ra, một số chức năng trong các chủ đề mặc định có thể cắm được. Việc mở rộng một lớp và thay thế các phương thức phức tạp hơn nhiều so với việc chỉ định nghĩa hàm. Và trong khi hai khía cạnh khác nhau của mã có thể thay thế các chức năng khác nhau, bạn không thể tự động mở rộng các lớp. Như bạn đã chỉ ra, nhu cầu mở rộng một lớp cha mẹ chắc chắn là một bất lợi.

Tôi đã cân nhắc việc biến các tùy chọn chủ đề của Twenty Eleven thành một lớp, nhưng không bao giờ có được nó. Đó là loại chức năng riêng biệt, giống như plugin có vẻ như là một ứng cử viên tốt cho việc đóng gói.


Cảm ơn câu trả lời, Nacin. Tôi đã không nghĩ về sự khó khăn trong các hành động "không biết" với các lớp học. Về đóng gói tùy chọn - chúng tôi đã suy nghĩ điều tương tự: github.com/jestro/struts
Andy Adams
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.