如何确定module_exists和function_exists之间?


8

我熟悉module_exists在模块中使用,并在类似情况下使用它:

但是,也function_exists有如“ 是否有可能在Hook.info声明Javascript库依赖项 ” 答案中所示。

我的印象function_exists是与相比,使用是一种更可靠(安全)的方法module_exists。特别是如果您要确保某些功能(在模块的较新版本中添加)可用,而仅使用module_exists,就可能会遇到类似以下错误的风险:

  • 如果一个网站仍在使用版本的模块,它不具有的功能尚未(所以你不应该尝试使用它 尚未)。
  • 如果网站已经使用的模块,它不具有该功能的版本(所以你不应该尝试使用它 )。

我的问题是:决定使用哪种module_existsvs 的典型标准或优点/缺点是 function_exists什么?

Answers:


13

您应该始终使用API​​而不是实现进行编程。如果Drupal提供了一种做某事的机制,请使用它。

module_exists()应该几乎总是用于对Drupal模块提供的内容的软依赖。您始终可以使用获取版本信息,并决定要做什么system_get_info()。在某些情况下,禁用模块后功能可用(某些自动装带器模块存在此问题)。

function_exists()应该保留用于检查PHP功能或库是否可用。Core在一些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')) {
    // ...
  }
}

我同意他们之间并没有真正的可比性
Jimmy Ko

您是说图书馆模块MODULENAME_requirements在链接的帖子中签入吗?是的,调用会更有意义module_exists。正如MPD所提到的,确保依赖项具有某些功能的高级/抽象方法是检查发行版的代码,并使您的代码依赖于您知道所使用代码的特定版本。就像作曲家/ NPM /捆扎机/等做到这一点
克莱夫

4

没错,这function_exists是一种检查contrib模块提供的API函数是否存在的更可靠的方法。非常适合直接使用contrib模块的API。

我用 会话缓存API为例:

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

但是,某些contrib模块仅提供一些额外的属性或功能,很难说哪个依赖函数是。在这种情况下,您需要使用module_exists

我以Elements为例:

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

有趣!我需要更多时间来“消化”……
Pierre.Vriens

1
您怎么知道session_cache_set是由drupal.org/project/session_cache还是由另一个模块提供的,因此您想要什么?
mpdonadio

1
@MPD取决于您是否相信每个人都使用建议的相同命名策略。function_exists当contrib模块在更新后确实更改了其API时,可以防止未定义的函数错误。当然,最保证的方法是function_exists使用module_exits@Clive提到的方法包装,但是对我来说,这太麻烦了。
吉米·柯

1
@MPD从理论上讲,答复界面是一种更好的方法,我很乐意效仿。但是实际上,function_exits确实阻止了网站完全崩溃……
Jimmy Ko

4

前面的3个(有趣的)答案在某种程度上证实了我的“感知”(如我在问题中所述)。有趣的是,这些答案最初是彼此独立编写的(它们在大约同一时间发布,如该问题时间表所示),请使用“切换格式”查看“分钟”)。

吉米高的答案(在其下方有+注释),举例说明了更多有关如何使用function_exists模块使模块相对于模块所使用的其他模块(取决于)可能发生的变化更加健壮的示例。

Clive的答案表明您也可以结合module_existsfunction_exists,而下面的注释解决了我对我的function_exists示例的怀疑(即,它应该使用module_exists)。

mpdonadio的答案(在它下方的评论)至少对我来说是最难理解的。但是在查看了Shawn Conn的评论后,我发现了一些其他链接,这些链接提供了有关所有这些内容的更多细节,即:

“我的结论”(在消化完先前的答案之后):将其留给Drupal核心使用function_exists,并且贡献/自定义模块应该尽可能地坚持module_exists……尽管有例外……

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.