Function_Existes()在哪里确定函数是否存在?

时间:2013-12-05 作者:Daniel Dropik

文件说明:

检查已定义函数(内置(内部)和用户定义)列表中的function\\u name。()SOURCE: http://php.net/manual/en/function.function-exists.php)

该函数是否仅使用function\\u exists扫描单个php文档,查找任何匹配的函数?

例如,如果我有if ( function_exists( \'get_custom_header\' ) 在标题中。php,函数将查找get_custom_header 在标题中。php?

或者该函数是否查找其他目录和/或文件,例如函数。php或WordPress核心中的其他文件(即wp admin文件夹或wp includes文件夹)?

3 个回复
SO网友:Mark Kaplun

function_exists(\'f\') 将检查函数f 在调用函数\\u之前声明。因此,您的问题的直接答案是-在解释器内存的函数部分。

的结果function_exists 不仅要依赖于声明函数的文件和调用的文件,还要依赖于执行路径。

function a() {}
-- at another file executed later
echo function_exists(\'a\');

// displays true

echo function_exists(\'a\');
// display false;
-- at another file executed later
function a() {}
function_exists 在与函数定义相同的文件中(这是一个无关紧要的用例),总是返回true,因为解释器在开始执行文件之前解析所有函数。

更有趣的是,只有在对其父函数求值并且所有php函数都在全局范围内时,才定义嵌套函数,这可能导致

function a() {
  function b() {}
}

echo function_exists(\'b\');

// displays false

function a() {
  function b() {}
}

a();
echo function_exists(\'b\');

// displays true
在像WordPress这样的大型复杂代码中,预测function_exists 这可能就是core不再使用此模式的原因。如果你有选择,你应该用钩子代替。

SO网友:sun

Yes php函数function_exists 只需在其所在的文件中扫描函数,而不在符合以下条件的包含文件中function_exists. 因此,为了检查函数,应在function_exists 条件

这将回显yes,因为函数look在检查条件之前包含在文件中。

include(\'ext_include.php\');
if (function_exists(\'look\')) {
    echo "yes";
} else {
    echo "no";
}
这不会回显是,而是回显否

if (function_exists(\'look\')) {
    echo "yes";
} else {
    echo "no";
}
include(\'ext_include.php\');
注:ext_include.php 是具有look 作用

希望这有帮助。

SO网友:Twifty

当PHP解析器解析文件时,从index.php 到包含您的function_exists, 它读取每个变量、函数、类、方法、属性。。。literaly所有内容,并将其存储在大型Hash Table. 基本上,这些方法/变量的名称是散列的,并用作键。

现在当你打电话的时候function_exists 它对函数名进行哈希运算,并在该哈希表中查找匹配的键。因此,在调用该函数之前,它了解所有内容,包括包含的每个文件中的内容includerequire. 但它不知道以后会发生什么。

结束

相关推荐

从图像路径中删除‘wp-Content/Themes/Themename/’

我目前正在将一个基于其他CMS的旧网站移动到一个新服务器上,使用WordPress。然而,这个网站在Google上排名很好,我必须保留所有的链接结构,包括来自图片的链接结构。因此,在旧CMS中,图像链接如下:http://www.domain-name.de/images/image1.jpg 现在,他们是这样的:http://www.domain-name.de/wp-content/themes/theme-name/images/image1.jpg 但它们必须与第一个示例中的一