Bagaimana cara memutuskan antara module_exists dan function_exists?


8

Saya terbiasa menggunakan module_existsmodul, dan menggunakannya dalam situasi seperti:

Namun, ada juga function_exists, seperti yang ditunjukkan dalam jawaban untuk " Apakah mungkin untuk mendeklarasikan ketergantungan perpustakaan Javascript di Hook.info? ".

Saya memiliki kesan bahwa menggunakan function_existsadalah pendekatan yang lebih kuat (aman) dibandingkan dengan module_exists. Terutama jika Anda ingin memastikan bahwa beberapa fungsi (ditambahkan dalam versi modul yang lebih baru) tersedia, sedangkan dengan hanya menggunakan module_exists, Anda berisiko mengalami kesalahan seperti:

  • jika sebuah situs adalah masih menggunakan tua versi modul, yang tidak memiliki fungsi belum (sehingga Anda tidak harus mencoba untuk menggunakannya belum ).
  • jika situs sudah menggunakan versi baru modul, yang tidak memiliki fungsi itu lagi (jadi Anda tidak harus mencoba menggunakannya lagi ).

Pertanyaan saya : apa kriteria khas, atau pro / kontra, untuk memutuskan untuk menggunakan module_existsversus function_exists?

Jawaban:


13

Anda harus selalu memprogram ke API dan bukan implementasinya. Jika Drupal menyediakan mekanisme untuk melakukan sesuatu, gunakan itu.

module_exists()seharusnya hampir selalu digunakan untuk soft dependency pada sesuatu yang disediakan oleh modul Drupal. Anda selalu dapat memperoleh info versi, dan memutuskan apa yang harus dilakukan, menggunakan system_get_info(). Ada kasus di mana fungsi tersedia ketika modul telah dinonaktifkan (beberapa modul autoloader kelas memiliki masalah ini).

function_exists()harus disediakan untuk memeriksa apakah fitur PHP atau pustaka tersedia. Core memiliki beberapa contohnya di beberapa drupal_bungkus untuk manipulasi string dan konversi rangkaian karakter.


10

module_existsadalah fungsi Drupal API yang digunakan untuk menentukan apakah suatu modul terpasang , tidak dirancang untuk memberikan jaminan fungsionalitas yang mungkin terkandung dalam modul, termasuk fungsi apa yang dinyatakannya.

function_exists adalah fungsi inti PHP yang secara literal menentukan apakah suatu fungsi dengan nama yang diberikan ada dalam permintaan saat ini.

Dengan demikian, mereka tidak benar-benar sebanding satu sama lain, Anda menggunakannya untuk hal-hal yang berbeda. Sebenarnya itu akan mudah, walaupun berpotensi berlebihan, bagi mereka untuk saling melengkapi, misalnya

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

Saya setuju mereka tidak benar-benar sebanding satu sama lain
Jimmy Ko

Apakah maksud Anda modul perpustakaan memeriksa di MODULENAME_requirementspos yang ditautkan? Ya, itu akan lebih masuk akal sebagai panggilan untuk module_exists. Seperti yang disebutkan MPD, cara tingkat tinggi / lebih abstrak untuk memastikan bahwa dependensi memiliki fungsi tertentu adalah memeriksa kode untuk rilis, dan membuat kode Anda bergantung pada versi spesifik yang Anda tahu kode Anda berfungsi. Sama seperti Composer / NPM / Bundler / etc melakukannya
Clive

4

Anda benar, function_existsadalah cara yang lebih kuat untuk memeriksa keberadaan fungsi API yang disediakan oleh modul contrib. Sangat cocok untuk langsung menggunakan API modul contrib.

Saya menggunakan API Sesi Cache sebagai contoh:

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

Namun, beberapa modul contrib hanya menyediakan beberapa properti atau fitur tambahan, sangat sulit untuk mengatakan fungsi dependennya. Dalam hal ini, Anda harus menggunakanmodule_exists

Saya menggunakan Elemen sebagai contoh:

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

Menarik! Saya akan membutuhkan lebih banyak waktu untuk "mencerna" ...
Pierre.Vriens

1
Bagaimana Anda tahu apakah session_cache_setdisediakan oleh drupal.org/project/session_cache atau modul lain, dan karenanya melakukan apa yang Anda inginkan?
mpdonadio

1
@ MPD Tergantung pada apakah Anda percaya pada semua orang yang menggunakan strategi penamaan yang sama seperti yang disarankan. function_existsdapat mencegah kesalahan fungsi yang tidak terdefinisi ketika modul contrib mengubah API setelah pembaruan. Tentu saja, metode jaminan paling banyak adalah wrap function_existsdengan module_exitsseperti yang disebutkan @Clive, tapi, bagi saya, itu terlalu membosankan.
Jimmy Ko

1
@MPD Secara teoritis, membalas antarmuka adalah pendekatan yang lebih baik, dan saya ingin mengikuti. Namun secara praktis, function_exitsmemang mencegah situs dari sepenuhnya menengahi ...
Jimmy Ko

4

3 jawaban (menarik) sebelumnya tampak pada saya sebagai entah bagaimana mengkonfirmasikan "persepsi" saya (seperti yang saya jelaskan dalam pertanyaan saya). Yang cukup menarik, jawaban-jawaban itu awalnya ditulis independen satu sama lain (mereka diposting pada saat yang kurang lebih sama, seperti yang diilustrasikan dalam timeline pertanyaan ini , gunakan "format beralih" untuk melihat "menit").

Jawaban Jimmy Ko (+ komentar di bawahnya), mengilustrasikan beberapa contoh lebih lanjut tentang bagaimana menggunakan function_existsdapat membuat modul lebih kuat sehubungan dengan kemungkinan perubahan dalam beberapa modul lain yang menggunakan modul (tergantung pada).

Jawaban Clive menunjukkan Anda bisa juga menggabungkan module_existsdan function_exists, sementara komentar di bawah ini menyelesaikan keraguan saya tentang function_existscontoh saya (yaitu lebih baik harus menggunakan module_exists).

Jawaban mpdonadio (+ komentar di bawahnya), setidaknya bagi saya, yang paling sulit dicerna. Tetapi setelah meninjau komentar Shawn Conn di bawahnya, saya menemukan beberapa tautan lagi yang memberikan rincian lebih lanjut tentang semua ini, yaitu:

"Kesimpulan saya" (setelah mencerna jawaban sebelumnya): Serahkan ke inti Drupal untuk digunakan function_exists, dan modul kontribusi / kustom harus berusaha, sebisa mungkin, untuk tetap berpegang pada module_exists... meskipun ada pengecualian ...

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.