module_existsとfunction_existsをどのように決めるのですか?


8

私はmodule_existsモジュールでの使用と、次のような状況での使用に精通しています。

ただし、「Hook.infoでJavaScriptライブラリの依存関係を宣言することはできますか?function_existsの回答に示されているようなものもあります

を使用することfunction_existsは、に比べてより堅牢な(安全な)アプローチであるという印象がありますmodule_exists。特に、(新しいバージョンのモジュールに追加された)いくつかの関数が利用可能であることを確認したい場合は、を使用するだけでmodule_exists、次のようなエラーが発生する危険性があります。

  • サイトがされている場合、まだ使用して古いその機能を持っていない、モジュールのバージョンをまだ(あなたがそれを使用しようとするべきではありませんので、 まだ)。
  • サイトがすでに新しいバージョンのモジュールを使用している場合、そのモジュールにはその機能はありません(したがって、もう使用し ないでください)。

私の質問:一般的な基準、または長所/短所は何ですか、いずれかを使用するために決定する module_existsfunction_exists

回答:


13

実装ではなく、常にAPIにプログラムする必要があります。Drupalが何かを行うメカニズムを提供している場合は、それを使用してください。

module_exists()ほとんどの場合、Drupalモジュールによって提供されるものへのソフト依存関係に使用する必要があります。を使用すると、いつでもバージョン情報を取得し、何をすべきかを決定できsystem_get_info()ます。モジュールが無効になっているときに機能を使用できる場合があります(一部のクラスオートローダーモジュールにこの問題があります)。

function_exists()PHPの機能またはライブラリが利用可能かどうかを確認するために予約する必要があります。コアはdrupal_、文字列操作と文字セット変換の一部のラッパーにこの例をいくつか持っています。


10

module_existsは、モジュールがインストールされているかどうかを判断するために使用されるDrupal API関数です。宣言されている関数など、モジュールに含まれる機能を保証するようには設計されていません。

function_exists 指定された名前の関数が現在のリクエストに存在するかどうかを文字通り決定するPHPコア関数です。

そのため、それらは実際には互いに比較できません。別の目的で使用します。実際、冗長になる可能性はあるものの、互いに補完し合うことは簡単です。たとえば、

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

私はそれらが実際には互いに比較できないこと
ジミー・コ

MODULENAME_requirementsリンクされた投稿でライブラリモジュールがチェックインするということですか?はい、それはへの呼び出しとしてより理にかなっていますmodule_exists。MPDが述べたように、依存関係に特定の機能があることを確認するためのより高いレベル/より抽象化された方法は、リリースのコードを調べ、コードが動作することがわかっている特定のバージョンにコードを依存させることです。Composer / NPM / Bundler / etcと同じように
Clive

4

そうですfunction_exists、contribモジュールによって提供されるAPI関数の存在を確認するためのより堅牢な方法です。contribモジュールのAPIを直接使用するのに非常に適しています。

例としてセッションキャッシュAPIを使用します

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

ただし、一部のcontribモジュールは、いくつかの追加のプロパティまたは機能のみを提供します。どの依存関数がどれであるかを言うのは非常に困難です。この場合、使用する必要がありますmodule_exists

要素として例を使用します:

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

面白い!「ダイジェスト」するにはもう少し時間が必要です...
Pierre.Vriens

1
drupal.org/project/session_cachesession_cache_setによって提供されているのか、それとも別のモジュールによって提供されているのかをどのようにして知ることができますか?
mpdonadio

1
@MPD提案されているのと同じ命名戦略を使用している全員を信じるかどうかによって異なります。function_existscontribモジュールが更新後にAPIを変更したときに未定義の関数エラーを防ぐことができます。もちろん、最も確実な方法は@Cliveで述べたようにラップfunction_existsするmodule_exitsことですが、私にとっては面倒です。
Jimmy Ko

1
@MPD理論的には、返信インターフェースの方が優れたアプローチであり、フォローしたいと思います。しかし、function_exits実際には、サイトが完全にダウンすることを実際に防ぎます...
Jimmy Ko

4

以前の3つの(興味深い)回答は、私の「認識」を確認しているように見えます(私の質問で説明したとおり)。興味深いことに、これらの回答は元々互いに独立して書かれていました(多かれ少なかれほぼ同時に投稿されました。この質問タイムラインに示されているように、「トグル形式」を使用して「分」を確認してください)。

Jimmy Koの回答(+その下のコメント)はfunction_exists、モジュールが使用する(依存する)他のモジュールで起こり得る変更に関して、モジュールをより堅牢にする方法のいくつかの例を示しています。

Cliveの答えはmodule_existsand も組み合わせることができることを示していますが、function_exists以下のコメントは私のfunction_exists例に対する私の疑問を解決しました(つまり、を使用する必要がありますmodule_exists)。

mpdonadioの答え(+その下のコメント)は、少なくとも私にとって、消化するのが最も難しいです。しかし、その下にあるShawn Connのコメントを確認した後、これに関するすべての詳細を提供するリンクがさらにいくつか見つかりました。

「私の結論」(以前の回答を要約した後):使用するのはDrupalコアに任せてください。コンfunction_existsトリビュート/カスタムモジュールは、可能な限りmodule_exists... に固執するようにすべきです...例外はありますが...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.