it-swarm.com.de

Wie entscheide ich mich zwischen module_exists und function_exists?

Ich bin mit der Verwendung von module_exists In einem Modul und in folgenden Situationen vertraut:

Es gibt jedoch auch function_exists, Wie in der Antwort auf " Ist es möglich, eine Abhängigkeit der Javascript-Bibliothek bei Hook.info zu deklarieren? ".

Ich habe den Eindruck, dass die Verwendung von function_exists Im Vergleich zu module_exists Ein robusterer (sicherer) Ansatz ist. Insbesondere, wenn Sie sicherstellen möchten, dass eine Funktion (die in einer neueren Version eines Moduls hinzugefügt wurde) verfügbar ist. Wenn Sie jedoch nur module_exists Verwenden, besteht die Gefahr, dass Fehler wie die folgenden auftreten:

  • wenn eine Site still mit einem alt Version eines Moduls, das diese Funktion nicht hat noch (Sie sollten also nicht versuchen, es zu verwenden noch).
  • wenn eine Site bereits mit einem neu Version eines Moduls, das diese Funktion nicht hat mehr (Sie sollten also nicht versuchen, es zu verwenden mehr).

Meine Frage : Was sind die typischen Kriterien oder Vor-/Nachteile, um entweder module_exists Oder function_exists Zu verwenden? ?

8
Pierre.Vriens

Die vorherigen 3 (interessanten) Antworten scheinen mir irgendwie meine "Wahrnehmung" zu bestätigen (wie ich in meiner Frage beschrieben habe). Interessanterweise wurden diese Antworten ursprünglich unabhängig voneinander geschrieben (sie wurden mehr oder weniger im selben Moment veröffentlicht, wie in der Zeitleiste dieser Frage dargestellt , verwenden Sie das "Umschaltformat", um siehe "min").

Jimmy Ko 's Antwort (+ Kommentare darunter) zeigt einige weitere Beispiele dafür, wie die Verwendung von function_exists Ein Modul gegenüber möglichen Änderungen in einem anderen Modul robuster machen kann ein Modul verwendet (abhängig von).

Clive's Antwort zeigt, dass Sie auch module_exists Und function_exists Kombinieren können, während der Kommentar darunter meine Zweifel an meinem Beispiel function_exists (Dh) löste es sollte lieber module_exists) verwendet werden.

mpdonadio 's Antwort (+ Kommentare darunter) ist zumindest für mich am schwersten zu verdauen. Aber nachdem ich den Kommentar von Shawn Conn überprüft habe, habe ich ein paar weitere Links gefunden, die mehr Details zu all dem enthalten, d. H.:

"Meine Schlussfolgerung" (nach dem Verdauen der vorherigen Antworten): Überlassen Sie es Drupal Core, um function_exists und beigesteuerte/benutzerdefinierte Module sollten so weit wie möglich versuchen, sich an module_exists zu halten ... obwohl es Ausnahmen gibt ...

4
Pierre.Vriens

Sie sollten immer auf die API und nicht auf die Implementierung programmieren. Wenn Drupal bietet einen Mechanismus, um etwas zu tun, verwenden Sie ihn.

module_exists() sollte fast immer für weiche Abhängigkeiten von etwas verwendet werden, das von einem Drupal - Modul bereitgestellt wird. Mit der Funktion system_get_info(). Es gab Fälle, in denen Funktionen verfügbar waren, wenn Module deaktiviert wurden (einige der Klassen-Autoloader-Module haben dieses Problem).

function_exists() sollte reserviert werden, um zu überprüfen, ob eine PHP -Funktion oder -Bibliothek verfügbar ist. Core hat einige Beispiele dafür in einigen der drupal_ Wrapper für die Manipulation von Zeichenfolgen und die Konvertierung von Zeichensätzen.

13
mpdonadio

module_exists ist eine Drupal API-Funktion, mit der bestimmt wird, ob ein Modul installiert ist. Sie soll keine Garantie für die Funktionalität eines Moduls geben, einschließlich welche Funktionen es deklariert.

function_exists ist eine PHP Kernfunktion, die buchstäblich bestimmt, ob eine Funktion mit einem bestimmten Namen in der aktuellen Anforderung vorhanden ist.

Als solche sind sie nicht wirklich miteinander vergleichbar, man benutzt sie für verschiedene Dinge. Tatsächlich wäre es für sie leicht, wenn auch möglicherweise überflüssig, sich zu ergänzen, z.

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

Sie haben Recht, function_exists Ist eine robustere Methode, um das Vorhandensein der vom Contrib-Modul bereitgestellten API-Funktion zu überprüfen. Es ist sehr gut geeignet, um die API des Contrib-Moduls direkt zu verwenden.

Ich benutze Session Cache API als Beispiel:

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

Einige Contrib-Module bieten jedoch nur einige zusätzliche Eigenschaften oder Funktionen. Es ist sehr schwer zu sagen, um welche abhängige Funktion es sich handelt. In diesem Fall müssen Sie module_exists Verwenden.

Ich benutze Elements als Beispiel:

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