Hiểu về Drupal 8 và không gian tên


7

Tôi chưa quen với không gian tên và tôi đang thực hành với Drupal 8. Tôi đã tạo một mô-đun tùy chỉnh và đã cài đặt contrib, devel.

Trong mô-đun của tôi, tôi đã xác định một khối, đây là mã của tôi:

không gian tên Drupal \ twitter_pull \ Plugin \ Block;
sử dụng Drupal \ block \ BlockBase;

/ **
 * Cung cấp một khối để thực thi mã PHP.
 *
 * @Khối(
 * id = "twitter_pull_tweets_block",
 * admin_label = @Translation ("Tweet Twitter")
 *)
 * /
lớp TweetsBlock mở rộng BlockBase {

  / **
   * Xây dựng và trả về mảng kết xuất cho plugin khối này.
   *
   * mảng @return
   * Một mảng kết xuất đại diện cho nội dung của khối.
   *
   * @see \ Drupal \ block \ BlockViewBuilder
   * /
  xây dựng hàm công khai () {
    dpm (mảng ('this', 'là', 'a', 'test'));
    trả lại 'đây là một khối';
  }
}

và nó hoạt động tốt. Nhưng điều tôi không hiểu là: tại sao tôi có quyền truy cập vào các hàm phát? Trường hợp trong mã của tôi, tôi bao gồm không gian tên cho devel mà tôi nên có quyền truy cập vào dpm ()?

Câu trả lời:


7

Trực tiếp từ các tài liệu không gian toàn cầu PHP :

Không có bất kỳ định nghĩa không gian tên nào, tất cả các định nghĩa lớp và hàm được đặt vào không gian toàn cục - như trong PHP trước khi các không gian tên được hỗ trợ. Tiền tố tên với \ sẽ chỉ định rằng tên được yêu cầu từ không gian toàn cầu ngay cả trong ngữ cảnh của không gian tên.

Devel's dpm()được khai báo trong 'Không gian toàn cầu' và vì không có dpm()chức năng nào khác được khai báo trong không gian tên của bạn, nên 'toàn cầu' được sử dụng (không cần tiền xử lý \).


3
Chính xác, ngoài ra, các chức năng là đặc biệt và khác với các lớp. Các lớp trong không gian tên toàn cầu phải được tham chiếu với một \ hàng đầu, trong khi các hàm tự động quay trở lại không gian tên toàn cục. Tuy nhiên, điều khó hiểu là nếu không tìm thấy một hàm (không phải là không gian tên toàn cầu hoặc hiện tại), thì lỗi sẽ bao gồm không gian tên hiện tại.
Berdir

Rất thú vị. Tôi nghĩ rằng không gian tên là một yêu cầu trong drupal 8, nhưng tôi thấy rằng tệp devel.module không có không gian tên và đó là nơi đặt chức năng dpm. Có phải các không gian tên không phải là một yêu cầu khi nằm trong tệp .module?
1015214

2
'Yêu cầu' có lẽ không phải là từ chính xác ... Drupal sử dụng một autoloader PSR-4 để khám phá lớp học dựa trên một quy ước đặt tên nghiêm ngặt (PHP sẽ được thông báo để tìm kiếm Drupal\my_module\SomeClasstrong /path/to/my_module/src/SomeClass.php, ví dụ). Đối với các lớp không được tự động phát hiện bằng cách chú thích (như plugin), về mặt lý thuyết, chúng không phải được đặt tên; PHP / Drupal sẽ không quan tâm miễn là tên lớp là duy nhất trong không gian toàn cầu. Tất nhiên gây ô nhiễm không gian toàn cầu là xấu, và mô đun hóa mã của một người luôn là một điều tốt, vì vậy hãy luôn sử dụng nó cho các lớp ...
Clive

1
... Theo như các chức năng, tôi chưa bắt gặp một khung công tác đặt tên cho các chức năng. Tôi chắc chắn có các trường hợp cạnh hợp lệ cho nó, nhưng trong kiến ​​trúc OO, nó không có ý nghĩa gì nhiều. D8 vẫn là một hỗn hợp của mã thủ tục và mã OO, vì vậy bạn vẫn sẽ tìm thấy rất nhiều chức năng trong phạm vi toàn cầu. Hệ thống hook cũng không cho vay quá nhiều chức năng trong phạm vi, mọi thứ dễ dàng hơn nhiều so với các chức năng toàn cầu, vì vậy bạn có thể nói rằng D8 có yêu cầu không sử dụng không gian tên cho các chức năng
Clive
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.