Sử dụng namespace & Autoload trong Plugin Phần 3 đây cũng là cách viết add_meta_box trong class (ok)

https://code.tutsplus.com/vi/tutorials/using-namespaces-and-autoloading-in-wordpress-plugins-3--cms-27332

Trong hướng dẫn này, chúng ta sẽ ngưng viết code và xem không gian tên và autoload trong PHP là gì, cách chúng hoạt động và tại sao chúng có lợi. Sau đó, chúng ta sẽ chuẩn bị kết thúc loạt bài này bằng cách cài đặt chúng bằng code.

Nếu bạn không theo kịp mọi thứ mà chúng ta đã thảo luận trong loạt bài này, thì tôi khuyên bạn nên quay lại và xem lại những gì chúng ta đã đề cập đến từ trước tới nay. Ít nhất, hãy xem lại bài viết trước vì nó sẽ đặt nền móng cho những gì chúng ta sẽ thảo luận trong hai bài tiếp theo.

Bây giờ bạn đã theo kịp, bạn lưu ý đến plugin mà chúng ta đang làm việc trên nó, nó làm gì và hoạt động như thế nào. Hơn nữa, bạn nên thiết lập một môi trường phát triển cục bộ cho phép bạn làm việc với mã nguồn. Nếu không, dưới đây là một tóm tắt ngắn gọn về tất cả mọi thứ mà bạn cần:

  • Môi trường phát triển cục bộ bao gồm PHP 5.6.20, máy chủ web Apache và máy chủ cơ sở dữ liệu MySQL.

  • Một thư mục chứa WordPress 4.6.

  • Một trình soạn thảo hay IDE mà bạn quen dùng để viết một plugin.

  • Kiến thức về WordPress Plugin API.

Giả sử bạn đã cài đặt tất cả và sẵn sàng theo dõi cùng với phiên bản mới nhất của plugin, thì chúng ta đã sẵn sàng để tiếp tục thảo luận về không gian tên, autoload và plugin trong WordPress.

Không gian tên và Autoload

Đối với những ai đã làm việc với các ngôn ngữ lập trình hiện đại khác, thì họ có thể đã quen với khái niệm không gian tên. Nhưng ngay cả khi bạn đã làm việc với PHP, không có vẻ gì là bạn đã nhìn thấy nhiều về chúng, ít nhất là trong ngữ cảnh của WordPress.

Đối với những bạn chưa từng nghe về chúng hoặc những người đã nghe nói về chúng nhưng chưa từng sử dụng chúng, thì đó là những gì mà bài viết cụ thể này đề cập đến. Cụ thể, chúng ta sẽ nói về không gian tên và autoload và sau đó trong hướng dẫn tiếp theo, chúng ta sẽ thấy chúng kết hợp với nhau như thế nào.

Nghĩa là, chúng ta sẽ lấy công việc mà chúng ta đã thực hiện với plugin của chúng ta và sau đó cập nhật nó để nó sử dụng không gian tên và autoload. Điều này sẽ cung cấp cho bạn một sự hiểu biết thực tế về các khái niệm cũng như một vài công cụ mới để bổ sung vào danh mục phát triển của bạn để khi bạn làm việc trong dự án tiếp theo của bạn.

Không gian tên Là Gì?

Cũng như với hầu hết các hướng dẫn của tôi, tôi muốn đưa ra định nghĩa mang tính lý thuyết và sau đó phân chia thành các thuật ngữ dễ hiểu. Hướng dẫn PHP định nghĩa không gian tên như sau:

Trong định nghĩa tổng quát nhất, không gian tên là một cách đóng gói các phần tử.

Điều đó chưa hẳn giúp ích nhiều cho chúng ta, đúng không? Người ta có thể lập luận rằng các lớp thực hiện điều tương tự cho phép các thuộc tính và các hàm có thể được tổng quát hóa như là các phần tử. Nhưng hướng dẫn sử dụng PHP tiếp tục:

Không gian tên trong PHP cung cấp một cách để nhóm các lớp, giao diện, hàm và hằng số có liên quan.

Điều đó đã rõ ràng hơn một chút rồi, phải không? Điều này có nghĩa là khi chúng ta có một nhóm các lớp có liên quan với nhau, chúng ta có thể nhóm chúng lại với nhau trong cùng một thư mục hoặc các thư mục tương tự trên hệ thống tập tin, nhưng không có cách nào để biết được điều đó bằng cách nhìn vào code.

Không gian tên cho chúng ta khả năng để làm điều đó.

Hãy nghĩ về nó theo cách này: Hãy tưởng tượng rằng bạn có một tập hợp các chức năng để làm việc với tập tin CSV.

  • Có thể bạn có một lớp chịu trách nhiệm đọc một tập tin CSV, phân tích và đọc nội dung vào một mảng.

  • Sau đó, bạn có một lớp chịu trách nhiệm lấy mảng đó và ghi vào cơ sở dữ liệu dựa trên nội dung của mảng.

  • Sau đó, có một lớp chịu trách nhiệm đọc các tùy chọn đó bất cứ khi nào một đối tượng bên thứ ba hoặc một khu vực khác trong code cần đọc dữ liệu đã được đọc, phân tích và lưu trữ trước đó trong quá trình thực thi dự án.

Tất cả các chức năng này sẽ trải rộng trên một số lớp. Tùy thuộc vào giải pháp viết code hướng đối tượng của bạn như thế nào, bạn có thể còn có một tập hợp các giao diện mà các lớp của bạn cài đặt. Hơn nữa, các lớp có thể được tổ chức trong một thư mục /csv nhưng chia nhỏ hơn nữa thành các thư mục con của riêng chúng.

  • /read

  • /write

Có thể bạn sẽ muốn tổ chức cấu trúc hơi khác biệt một chút, nhưng để giữ cho cuộc thảo luận càng đơn giản càng tốt, tôi nghĩ điều này là đủ để hiểu. Vì vậy, có lẽ các giao diện của lớp sẽ nằm trong thư mục /csv, lớp chịu trách nhiệm đọc sẽ nằm trong thư mục /read và các lớp chịu trách nhiệm ghi dữ liệu vào cơ sở dữ liệu sẽ nằm trong thư mục /write.

Không có điều gì mà tôi đã nói cho đến lúc này ngoài cách chúng ta có thể tổ chức các tập tin của chúng ta. Nhưng đây là nơi không gian tên phát huy tác dụng.

Cụ thể, điều gì sẽ xảy ra nếu chúng ta có thể tổ chức các lớp của chúng ta để chúng đồng thời ánh xạ tới vị trí thật của chúng trong hệ thống tập tin?

Hãy nghĩ về nó theo cách này: Giả sử plugin của bạn được gọi là Acme CSV, và các lớp ở trên đều được tổ chức trong các thư mục và thư mục con của chúng. Không gian tên có thể ra sao đối với các lớp này, và chúng sẽ được định nghĩa bên trong dự án như thế nào?

Hãy xem những gì mà chúng ta gọi là lớp Parser. Lớp này nằm trong /csv/read.

Và sau đó, giả sử chúng ta có lớp ghi dữ liệu vào cơ sở dữ liệu:

Cuối cùng, hãy xem không gian tên cho lớp đọc dữ liệu từ cơ sở dữ liệu trông như thế nào:

Không có gì quá phức tạp, phải không? Mặc dù tiêu chuẩn ở trên không nhất thiết là cách bạn phải tổ chức các tập tin của mình, nhưng tôi muốn cố gắng ánh xạ các lớp của tôi đến vị trí của chúng trên ổ đĩa. Nó giúp dễ dàng hơn để tham chiếu đến chúng trong công việc sau này.

Tại thời điểm này, không có gì hơn ngoài việc định nghĩa một kiểu tổ chức các lớp của bạn ở trên các tập tin của chúng. Nhưng khi bạn bắt đầu kết hợp với autoload, thì điều này sẽ thay đổi.

Tìm hiểu về Gói và Gói con

Tuy nhiên, trước khi chúng ta nói về autoload, tôi muốn nói bên ngoài chủ đề một chút về @package@subpackage mà chúng ta thường thấy trong các chú thích trên tập tin.

Ví dụ, bạn có lẽ đã thấy một cái gì đó tương tự như thế này liên quan đến code của chúng ta ở trên:

Nhưng khi bạn so với tài liệu hướng dẫn của phpDocumentor, bạn sẽ thấy những điều sau đây về @subpackage:

Thẻ này được xem là không dùng nữa và có thể bị loại bỏ trong một phiên bản tiếp theo của phpDocumentor. Bạn nên sử dụng khả năng của thẻ @package để tạo ra sự phân cấp.

Như vậy, @subpackage đang bị phản đối, có nghĩa là chúng ta không nên dùng nó nữa. Còn thẻ @package thì sao?

Thẻ @package được sử dụng để phân loại các Các phần tử Có cấu trúc thành các phân cấp hợp lý .

Sự hỗ trợ cho đa cấp lồng nhau giờ đây tồn tại duy nhất trong thẻ đó. Dễ hiểu, phải không? Điều này có nghĩa là code mà chúng ta thấy ở trên có thể được viết như sau:

Tất nhiên, đó là một ví dụ đơn giản, nhưng nó đã giúp làm rõ vấn đề. Tôi đề cập đến điều này vì @subpackage là một thẻ mà chúng ta thường nhìn thấy trong WordPress dựa trên PHP mà chúng ta cần tránh sử dụng nếu chúng ta muốn bắt đầu áp dụng các tiêu chuẩn mới hơn.

Autoload Là Gì?

Được rồi, hãy trở lại với các chủ đề chính của chúng ta. Vì chúng ta đã đề cập đến không gian tên, nên giờ chúng ta hãy xem xét autoload. Theo tài liệu hướng dẫn PHP:

Nhiều nhà phát triển viết các ứng dụng hướng đối tượng tạo ra một tập tin mã nguồn PHP cho mỗi định nghĩa lớp. Một trong những điều phiền toái nhất là phải viết một danh sách include dài cần thiết ở đầu mỗi script (một cho mỗi lớp).

Phát biểu này không thể rõ hơn được nữa, đúng không? Tuy nhiên, nó không thật sự giải thích autoload là gì. Nó chỉ giải thích vấn đề mà nó có thể giải quyết.

Trong PHP 5, điều này không còn cần thiết nữa... [nó hỗ trợ nạp] các lớp và giao diện được tự động nạp nếu chúng hiện không được định nghĩa.

Nghe có vẻ không tưởng, đúng không? Nhưng có đấy và chúng ta sẽ khám phá nó một cách chi tiết trong hướng dẫn tiếp theo. Nhưng cho đến lúc đó, đây là: Để có được tính năng này, chúng ta phải cài đặt một hàm biết nơi để tìm kiếm các tập tin để nạp và cách phân tích cấu trúc thư mục của những tập tin đó.

Nghe có vẻ chán ngắt, nhưng nếu bạn có một cách nhất quán để tổ chức công việc của bạn, thì autoload (tự động nạp) code của bạn có thể linh động. Nghĩa là, bạn có thể lấy các hàm mà bạn viết, đặt nó vào bất kỳ dự án dựa trên PHP nào, và bạn đã sẵn sàng.

Nhưng hướng dẫn cụ thể này không xoay quanh vấn đề viết code. Nó khái quát ý tưởng đằng sau các khái niệm về code mà chúng ta sẽ cài đặt trong hướng dẫn tiếp theo.

Tại sao Những điều này Có liên quan?

Tùy thuộc vào người mà bạn hỏi, bạn có thể xem không gian tên và autoload như là tính năng mới đối với PHP. Đối với một số người, điều này là đúng. Đối với những người khác, họ đã làm việc với hai khái niệm này trong một thời gian dài.

Một trong những điều về WordPress có thể cản trở việc áp dụng các tính năng mới của PHP là cam kết tương thích ngược của nó. Điều này không nhất thiết phải là điều tốt hay điều xấu—đó là một thuộc tính của ứng dụng.

Nhưng bởi vì WordPress có một phiên bản PHP tối thiểu mà nó chạy, nên các tính năng mới hơn của ngôn ngữ không phải lúc nào cũng được chấp nhận. Và khi phiên bản tối thiểu đó được nâng lên, thì phải mất một thời gian để các nhà phát triển WordPress bắt đầu sử dụng các tính năng này trong code của họ.

Và điều đó không hề tệ. Tóm lại, các nhà phát triển đang giữ nhịp độ ứng dụng mà tại đó nó trở nên hoàn thiện.

Tuy nhiên, khi WordPress tiếp tục phát triển hoặc bạn có quyền kiểm soát môi trường trong đó dự án của bạn chạy, bạn có thể hứng thú với việc áp dụng một số tính năng của ngôn ngữ mà trước đây bạn không biết là có tồn tại hoặc bạn chưa từng biết.

Không gian tên và autoload là hai tính năng mạnh mẽ của ngôn ngữ còn tiến xa hơn trong việc giúp cho code dễ đọc, tổ chức tốt hơn và thậm chí có thể dễ bảo trì hơn. Vì vậy, nếu bạn chưa từng sử dụng chúng trong bất kỳ công việc nào của bạn trong WordPress, đặc biệt nếu bạn đang làm việc với các plugin cho WordPress, thì tôi khuyên bạn nên xem xét làm như vậy.Advertisement

Tóm tắt

Không gian tên cho chúng ta khả năng tổ chức code của chúng ta theo một cách mà giúp cho việc phân nhóm hợp lý các lớp liên quan dễ dàng hơn nhiều. Hơn nữa, autoload mang lại cho code của chúng ta thêm dễ đọc bằng cách giảm số lượng các câu lệnh include, include_once, require, hay require_once mà chúng ta cần phải sử dụng.

Điều này làm cho mã nguồn mà chúng ta viết trở nên rõ ràng hơn vì nó chỉ tập trung vào logic mà nó chịu trách nhiệm, mà không cần phải làm bất cứ điều gì giống như import các tập tin, xử lý các cấu trúc thư mục khác nhau và để ý đến nhiều thứ không cần thiết (để cho các nhà phát triển phải liên tục nhập lại tất cả mọi thứ chỉ để họ có thể truy cập một tập tin).

Và đối với những người muốn đảm bảo cấu trúc code của họ tuân theo cấu trúc tổ chức của các tập tin và thư mục trên ổ đĩa, nó cho chúng ta khả năng tổ chức các dự án của chúng ta giống y như vậy.

Ngay cả với những gì đã nói, thì đây chỉ là một cách và một vài lợi thế của không gian tên và autoload. Các chủ đề nâng cao hơn được trình bày trong hướng dẫn sử dụng PHP và trong các dự án mã nguồn mở khác mà tôi khuyên bạn nên xem nếu bạn có thời gian.

Trong bài hướng dẫn tiếp theo, chúng ta sẽ tổng hợp loạt bài này bằng cách áp dụng những gì mà chúng ta đã học được trong hướng dẫn này khi chúng ta giới thiệu không gian tên và autoload cho plugin WordPress của chúng ta. Cho đến lúc đó, nếu bạn đang tìm kiếm các tài liệu liên quan đến WordPress, bạn có thể tìm thấy tất cả các hướng dẫn trước đây của tôi trên trang tiểu sử của tôi và bạn có thể theo dõi tôi trên blog hoặc trên Twitter của tôi.

Đừng ngần ngại để lại bất kỳ câu hỏi nào mà bạn có thể có về không gian tên, autoload, hoặc WordPress trong phần bình luận dưới đây.

Last updated