为什么要使用function_exists?


30

我注意到很多WordPress主题的开发人员都会在functions.php中使用它

if (function_exists('register_nav_menus')) {
    register_nav_menus (array('primary' => 'Header Navigation'));
}

对我来说,我总是对我在functions.php中使用的每个函数都使用add_action

因此,以上内容将写为:

add_action('init', 'my_register_nav_menus');

function my_register_nav_menus() {
    register_nav_menus (array('primary' => 'Header Navigation'));
}

我有两个问题:

  1. 为什么在第一种方法中使用if语句?

  2. 哪一种是正确的方法?

Answers:


35

在调用它们之前检查是否存在内置的WordPress函数是为了向后兼容,不需要IMHO。

因此,如果您看到if ( function_exists( 'register_nav_menus' ) )主题作者支持3.0之前的版本。

您有时还是看到if ( function_exists( 'dynamic_sidebar' ) )为什么?我无法告诉您,因为dynamic_sidebar在2.2中引入。

使用它的另一个原因是使主题或插件可插入。可插拔功能是可以在子主题或其他插件中覆盖的功能。

这是在定义而不是调用上完成的,您可以使用!运算符,以确保它在定义之前不存在。

if ( ! function_exists( 'my_awesome_function' ) ) {
/**
 * My Awesome function is awesome
 *
 * @param array $args
 * @return array
 */
function my_awesome_function( $args ) {
  //function stuff
  return array();
  }
}

完成此操作后,子主题或其他插件可以使用自己的主题覆盖该功能。


9

function_exists函数不是加载函数的另一种方式,例如add_action用于检查代码以查看是否没有其他同名函数,因此不会破坏您的代码。从php.net:

检查内置的(内部的)和用户定义的已定义函数的列表,以查找function_name。

如果你在你的代码具有相同的功能两次会打破,这就是为什么你前面加上你的功能与东西比其他WP_。

了解更多:http : //php.net/manual/en/function.function-exists.php


0

您可以使用http://php.net/function_exists

if(function_exists('my_function')){
   // my_function is defined
}

或者,如果您想查看所有可用功能,那么还可以打印所有功能,

echo "<pre>"; print_r(get_defined_functions());

在页面上打印,如果列表中未找到该功能,则表示您无法搜索该功能。

您可能需要激活特定库的扩展名。


0

php.net将此定义为

(PHP 4,PHP 5,PHP 7)function_exists —如果已定义给定函数,则返回TRUE

我必须同意Michelle的用法,因为您只能将检查用于类似于类型强制检查的检查;因此,您将寻找一个功能是否存在(在该页面上或在该页面/文件引用中调用的任何内容),这样您便可以知道是否可以安全地运行另一个功能或解析某些模板HTML。

正如有人提到的那样,它通常用于检查您的文件/主题(使用WordPress)是否能够运行您所需的请求。我已使用它来检查主题是否具有特定的模板部分。

if ( function_exists( 'register_sidebar' ) ) { get_sidebar(); }


0

function_exists 应该在主题中的函数名称之后而不是之前使用。

add_action( 'loop_start', 'add_slider' );

function add_slider() {

if ( function_exists( 'soliloquy' ) ) { 

soliloquy( 'slider', 'slug' ); 

    }

}

这会在输出函数和/或标记之前进行检查,以确保插件处于活动状态,否则您可能会收到诸如未定义函数的调用之类的错误消息。

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.