当前位置: 首页> 最新文章列表> 怎么用function_exists函数区分内置函数和自定义函数?详细方法解析

怎么用function_exists函数区分内置函数和自定义函数?详细方法解析

gitbox 2025-08-26
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 这部分代码和文章内容无关,可以放置一些声明或者注释</span></span><span>
</span><span><span class="hljs-comment">// 例如程序作者信息、时间戳等</span></span><span>
</span><span><span class="hljs-comment">// Author: ChatGPT</span></span><span>
</span><span><span class="hljs-comment">// Date: 2025-07-02</span></span><span>
</span><span><span class="hljs-meta">?></span></span><span>

<hr>

<h1>怎么用function_exists函数区分内置函数和自定义函数?详细方法解析</h1>

<p>在PHP开发过程中,我们经常会遇到需要判断某个函数是否存在的情况。PHP内置了一个非常实用的函数 <code></span><span><span class="hljs-title function_ invoke__">function_exists</span></span><span>()

使用 function_exists() 判断函数存在的基本示例

&lt;?php
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">function_exists</span></span><span>(</span><span><span class="hljs-string">'array_merge'</span></span><span>)) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'array_merge 函数存在'</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'array_merge 函数不存在'</span></span><span>;
}
?&gt;

在这个例子中,array_merge 是PHP的内置函数,通常都会返回存在。

为什么不能直接用 function_exists() 区分内置函数和自定义函数?

虽然 function_exists() 可以检测函数是否存在,但它本身无法告诉你这个函数是PHP内置的,还是用户自定义的。它只关心函数名是否被注册了。

换句话说,function_exists() 对内置函数和自定义函数是“平等”的,只判断是否存在,不区分来源。

那么,怎么区分内置函数和自定义函数?

要区分内置函数和自定义函数,可以结合 get_defined_functions() 函数使用。

该函数返回一个关联数组,包含两个键:

  • internal:所有内置函数名数组
  • user:所有用户自定义函数名数组

示例代码:

&lt;?php
</span><span><span class="hljs-variable">$allFunctions</span></span><span> = </span><span><span class="hljs-title function_ invoke__">get_defined_functions</span></span><span>();

</span><span><span class="hljs-variable">$functionName</span></span><span> = </span><span><span class="hljs-string">'array_merge'</span></span><span>;

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">function_exists</span></span><span>(</span><span><span class="hljs-variable">$functionName</span></span><span>)) {
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">in_array</span></span><span>(</span><span><span class="hljs-variable">$functionName</span></span><span>, </span><span><span class="hljs-variable">$allFunctions</span></span><span>[</span><span><span class="hljs-string">'internal'</span></span><span>])) {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<span class="hljs-subst">$functionName</span></span></span><span> 是内置函数";
    } </span><span><span class="hljs-keyword">elseif</span></span><span> (</span><span><span class="hljs-title function_ invoke__">in_array</span></span><span>(</span><span><span class="hljs-variable">$functionName</span></span><span>, </span><span><span class="hljs-variable">$allFunctions</span></span><span>[</span><span><span class="hljs-string">'user'</span></span><span>])) {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<span class="hljs-subst">$functionName</span></span></span><span> 是自定义函数";
    } </span><span><span class="hljs-keyword">else</span></span><span> {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<span class="hljs-subst">$functionName</span></span></span><span> 存在,但未分类";
    }
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<span class="hljs-subst">$functionName</span></span></span><span> 不存在";
}
?&gt;

完整示例:自定义函数与内置函数的区分

&lt;?php
</span><span><span class="hljs-comment">// 自定义函数示例</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">my_custom_func</span></span><span>(</span><span><span class="hljs-params"></span></span><span>) {
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-string">'这是自定义函数'</span></span><span>;
}

</span><span><span class="hljs-variable">$allFunctions</span></span><span> = </span><span><span class="hljs-title function_ invoke__">get_defined_functions</span></span><span>();

</span><span><span class="hljs-comment">// 检查内置函数</span></span><span>
</span><span><span class="hljs-variable">$func1</span></span><span> = </span><span><span class="hljs-string">'strlen'</span></span><span>;
</span><span><span class="hljs-comment">// 检查自定义函数</span></span><span>
</span><span><span class="hljs-variable">$func2</span></span><span> = </span><span><span class="hljs-string">'my_custom_func'</span></span><span>;
</span><span><span class="hljs-comment">// 检查不存在函数</span></span><span>
</span><span><span class="hljs-variable">$func3</span></span><span> = </span><span><span class="hljs-string">'non_exist_func'</span></span><span>;

</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">checkFunctionType</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$funcName</span></span></span><span>, </span><span><span class="hljs-variable">$allFunctions</span></span><span>) {
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">function_exists</span></span><span>(</span><span><span class="hljs-variable">$funcName</span></span><span>)) {
        </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">in_array</span></span><span>(</span><span><span class="hljs-variable">$funcName</span></span><span>, </span><span><span class="hljs-variable">$allFunctions</span></span><span>[</span><span><span class="hljs-string">'internal'</span></span><span>])) {
            </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<span class="hljs-subst">$funcName</span></span></span><span> 是内置函数\n";
        } </span><span><span class="hljs-keyword">elseif</span></span><span> (</span><span><span class="hljs-title function_ invoke__">in_array</span></span><span>(</span><span><span class="hljs-variable">$funcName</span></span><span>, </span><span><span class="hljs-variable">$allFunctions</span></span><span>[</span><span><span class="hljs-string">'user'</span></span><span>])) {
            </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<span class="hljs-subst">$funcName</span></span></span><span> 是自定义函数\n";
        } </span><span><span class="hljs-keyword">else</span></span><span> {
            </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<span class="hljs-subst">$funcName</span></span></span><span> 存在,但未分类\n";
        }
    } </span><span><span class="hljs-keyword">else</span></span><span> {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<span class="hljs-subst">$funcName</span></span></span><span> 不存在\n";
    }
}

</span><span><span class="hljs-title function_ invoke__">checkFunctionType</span></span><span>(</span><span><span class="hljs-variable">$func1</span></span><span>, </span><span><span class="hljs-variable">$allFunctions</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">checkFunctionType</span></span><span>(</span><span><span class="hljs-variable">$func2</span></span><span>, </span><span><span class="hljs-variable">$allFunctions</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">checkFunctionType</span></span><span>(</span><span><span class="hljs-variable">$func3</span></span><span>, </span><span><span class="hljs-variable">$allFunctions</span></span><span>);
?&gt;

运行以上代码,你会得到:

strlen 是内置函数
my_custom_func 是自定义函数
non_exist_func 不存在

总结

  • function_exists() 能检测函数是否已定义,但不能区分内置函数和自定义函数。
  • 通过 get_defined_functions() 获取系统所有函数,分别包含内置和用户自定义函数。
  • 结合这两个函数,可以准确判断一个函数是否存在,以及它是内置的还是自定义的。

掌握以上方法,能让你在PHP开发中更加灵活地处理函数相关的逻辑,避免命名冲突或重复定义,提高代码健壮性。