Làm cách nào để quyết định giữa module_exists và function_exists?


8

Tôi quen với việc sử dụng module_existstrong một mô-đun và sử dụng nó trong các tình huống như:

Tuy nhiên, cũng có function_exists, chẳng hạn như được hiển thị trong câu trả lời cho " Có thể khai báo một phụ thuộc thư viện Javascript tại Hook.info không? ".

Tôi có ấn tượng rằng sử dụng function_existslà một cách tiếp cận mạnh mẽ (an toàn) hơn so với module_exists. Đặc biệt nếu bạn muốn chắc chắn rằng một số chức năng (được thêm vào trong phiên bản mới hơn của mô-đun) có sẵn, trong khi chỉ bằng cách sử dụng module_exists, bạn có nguy cơ gặp phải các lỗi như:

  • nếu một trang web vẫn sử dụng một phiên bản của một module, mà không có mà chức năng chưa (vì vậy bạn không nên cố gắng sử dụng nó chưa ).
  • nếu một trang web đã sử dụng một phiên bản mới của mô-đun, không có chức năng đó nữa (vì vậy bạn không nên cố gắng sử dụng nó nữa ).

Câu hỏi của tôi : các tiêu chí điển hình, hoặc ưu / nhược điểm, để quyết định sử dụng module_existsso với function_exists?

Câu trả lời:


13

Bạn phải luôn lập trình API và không triển khai. Nếu Drupal cung cấp một cơ chế để làm một cái gì đó, hãy sử dụng nó.

module_exists()hầu như luôn luôn được sử dụng cho các phụ thuộc mềm vào thứ gì đó được cung cấp bởi mô-đun Drupal. Bạn luôn có thể lấy thông tin phiên bản và quyết định sử dụng system_get_info(). Đã có trường hợp các chức năng có sẵn khi các mô-đun bị vô hiệu hóa (một số mô-đun trình tải tự động lớp có vấn đề này).

function_exists()nên được dành riêng để kiểm tra xem một tính năng hoặc thư viện PHP có sẵn hay không. Core có một số ví dụ về điều này trong một số trình drupal_bao bọc để thao tác chuỗi và chuyển đổi tập ký tự.


10

module_existslà một hàm API Drupal được sử dụng để xác định xem mô-đun có được cài đặt hay không , nó không được thiết kế để đưa ra bất kỳ đảm bảo nào về chức năng mà mô-đun có thể chứa, bao gồm cả những chức năng mà nó tuyên bố.

function_exists là một hàm lõi PHP xác định theo nghĩa đen là một hàm có tên đã cho có tồn tại trong yêu cầu hiện tại hay không.

Như vậy, chúng không thực sự có thể so sánh với nhau, bạn sử dụng chúng cho những thứ khác nhau. Trong thực tế, nó sẽ dễ dàng, mặc dù có khả năng dư thừa, để họ bổ sung cho nhau, ví dụ

// Do something with a specific module 
if (module_exists('foo')) {
  // Check what's available 
  if (function_exists('foo_bar')) {
    // ...
  }
  elseif (function_exists('foo_baz')) {
    // ...
  }
}

Tôi đồng ý rằng họ không thực sự có thể so sánh với nhau
Jimmy Ko

Bạn có nghĩa là mô-đun thư viện kiểm tra trong MODULENAME_requirementsbài được liên kết? Vâng, điều đó sẽ có ý nghĩa hơn như một cuộc gọi đến module_exists. Như MPD đã đề cập, cách cao hơn / trừu tượng hơn để đảm bảo rằng phần phụ thuộc có chức năng nhất định là kiểm tra mã để phát hành và làm cho mã của bạn dựa vào một phiên bản cụ thể mà bạn biết mã của mình hoạt động. Giống như Nhà soạn nhạc / NPM / Bundler / v.v.
Clive

4

Bạn đã đúng, function_existslà một cách mạnh mẽ hơn để kiểm tra sự tồn tại của hàm API được cung cấp bởi mô-đun contrib. Nó rất phù hợp để sử dụng trực tiếp API của mô-đun đóng góp.

Tôi sử dụng API Cache phiên làm ví dụ:

if (function_exists('session_cache_set')) {
  session_cache_set($bin, $data)
}

Tuy nhiên, một số mô-đun đóng góp chỉ cung cấp một số thuộc tính hoặc tính năng bổ sung, rất khó để nói chức năng phụ thuộc là gì. Trong trường hợp này, bạn cần sử dụngmodule_exists

Tôi sử dụng các yếu tố làm ví dụ:

if (module_exists('elements')) {
  $form['url'] = array(
    '#type' => 'urlfield',
    // other code
  );
}
else {
  $form['url'] = array(
    '#type' => 'textfield',
    // other code
  );
}

Hấp dẫn! Tôi sẽ cần thêm thời gian để "tiêu hóa" ...
Pierre.Vriens

1
Làm thế nào bạn biết liệu session_cache_setđược cung cấp bởi drupal.org/project/session_cache hoặc một mô-đun khác, và do đó, những gì bạn muốn?
mpdon Arena

1
@MPD Nó phụ thuộc vào việc bạn có tin vào tất cả mọi người bằng cách sử dụng chiến lược đặt tên giống như đề xuất hay không. function_existscó thể ngăn lỗi lỗi không xác định khi mô-đun contrib đã thay đổi API sau khi cập nhật. Tất nhiên, phương pháp bảo đảm nhất được gói function_existsbằng module_exits@Clive đã đề cập, nhưng, với tôi, nó quá tẻ nhạt.
Jimmy Ko

1
@MPD Về mặt lý thuyết, trả lời giao diện là cách tiếp cận tốt hơn và tôi rất thích làm theo. Nhưng trong thực tế, function_exitsthực sự ngăn chặn trang web hoàn toàn môi giới xuống ...
Jimmy Ko

4

3 câu trả lời trước (thú vị) xuất hiện với tôi như bằng cách nào đó xác nhận "nhận thức" của tôi (như tôi đã mô tả trong câu hỏi của mình). Thật thú vị, những câu trả lời ban đầu được viết độc lập với nhau (chúng được đăng ít nhất cùng một lúc, như được minh họa trong dòng thời gian của câu hỏi này , sử dụng "định dạng chuyển đổi" để xem "phút").

Câu trả lời của Jimmy Ko (+ bình luận bên dưới nó), minh họa thêm một số ví dụ về cách sử dụng function_existscó thể làm cho mô-đun mạnh mẽ hơn đối với các thay đổi có thể có trong một số mô-đun khác mà mô-đun sử dụng (phụ thuộc vào).

Câu trả lời của Clive cho thấy bạn cũng có thể kết hợp module_existsfunction_exists, trong khi bình luận bên dưới nó giải quyết những nghi ngờ của tôi về function_existsví dụ của tôi (nghĩa là nó nên sử dụng module_exists).

Câu trả lời của mpdonadio (+ bình luận bên dưới nó), ít nhất là với tôi, là khó khăn nhất để tiêu hóa. Nhưng sau khi xem xét bình luận của Shawn Conn bên dưới nó, tôi đã tìm thấy một vài liên kết cung cấp thêm chi tiết về tất cả điều này, tức là:

"Kết luận của tôi" (sau khi tiêu hóa các câu trả lời trước): Để nó cho lõi Drupal sử dụng function_exists, và các mô-đun đóng góp / tùy chỉnh nên cố gắng, càng nhiều càng tốt, để bám vào module_exists... mặc dù vẫn có ngoại lệ ...

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.