Ich bin mit der Verwendung module_exists
in einem Modul vertraut und verwende es in Situationen wie:
- Aktivieren Sie einige zusätzliche Funktionen in einem Modul, sofern auf der Site auch ein anderes Modul verfügbar ist. Das Modul Reservierungen: E-Mail enthält ein Beispiel (tatsächlich gibt es viele Beispiele dafür), wie in seiner Modulquelle gezeigt : Um Token (im eMail-Text) zu verwenden, muss das Token- Modul aktiviert sein.
- Implementieren Sie Modulabhängigkeiten in einem Thema, wie in der Antwort auf " Wie implementiere ich Modulabhängigkeiten in einem Thema und Paketmodule mit einem Thema? " Gezeigt .
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? " Gezeigt .
Ich habe den Eindruck, dass die Verwendung function_exists
im Vergleich zu robuster (sicherer) ist module_exists
. 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 diese Funktion verwenden module_exists
, besteht die Gefahr, dass Fehler wie diese auftreten:
- wenn eine Seite ist immer noch mit einer alten Version eines Moduls, das nicht diese Funktion hat noch (so sollte man es nicht versuchen , verwenden noch ).
- Wenn eine Site bereits eine neue Version eines Moduls verwendet, das diese Funktion nicht mehr hat (Sie sollten also nicht mehr versuchen, sie zu verwenden ).
Meine Frage : Was sind die typischen Kriterien oder Vor- / Nachteile, um sich für die Verwendung von entweder module_exists
versus zu entscheiden function_exists
?
quelle
MODULENAME_requirements
im verlinkten Beitrag eincheckt ? Ja, das wäre als Anruf sinnvollermodule_exists
. Wie von MPD erwähnt, besteht die übergeordnete / abstraktere Methode, um sicherzustellen, dass eine Abhängigkeit über bestimmte Funktionen verfügt, darin, den Code für eine Version zu untersuchen und Ihren Code auf eine bestimmte Version zu stützen, mit der Ihr Code funktioniert. Genau wie Composer / NPM / Bundler / etcSie haben Recht, dies
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 verwende die Session Cache API als Beispiel:
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 verwenden
module_exists
Ich benutze Elements als Beispiel:
quelle
session_cache_set
es von drupal.org/project/session_cache oder einem anderen Modul bereitgestellt wird , und daher tun , was Sie wollen?function_exists
kann undefinierte Funktionsfehler verhindern, wenn das Contrib-Modul seine API nach dem Update geändert hat. Natürlich ist die am meisten garantierte Methode das Umschließenfunction_exists
mitmodule_exits
@Clive, aber für mich ist es zu langweilig.function_exits
verhindern Sie in der Tat, dass die Website vollständig herunterfährt ...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 "Minuten" anzuzeigen).
Die Antwort von Jimmy Ko (+ Kommentare darunter) zeigt einige weitere Beispiele dafür, wie die Verwendung
function_exists
eines Moduls gegenüber möglichen Änderungen in einem anderen Modul, das ein Modul verwendet, robuster macht (abhängig davon).Die Antwort von Clive zeigt, dass Sie sie auch kombinieren können,
module_exists
undfunction_exists
während der Kommentar unten meine Zweifel an meinemfunction_exists
Beispiel auflöste (dh es sollte eher verwendet werdenmodule_exists
).Die Antwort von mpdonadio (+ Kommentare darunter) ist zumindest für mich am schwersten zu verdauen. Aber nachdem ich Shawn Conns Kommentar darunter durchgesehen hatte, fand ich ein paar weitere Links, die mehr Details zu all dem enthalten, dh:
"Mein Fazit" (nach dem Zusammenfassen der vorherigen Antworten): Überlassen Sie die Verwendung dem Drupal-Kern
function_exists
, und beigesteuerte / benutzerdefinierte Module sollten so weit wie möglich versuchen, sich daran zu haltenmodule_exists
... obwohl es Ausnahmen gibt ...quelle