php自定义函数必须先定义(或通过require_once/include加载)才能调用,否则报fatal error;需注意作用域、命名空间前缀、参数匹配及function_exists检查。

Fatal error: Uncaught Error: Call to undefined function;定义在后却先调用,也会报这个错。
函数必须先定义(或已加载),才能直接调用
PHP 是自上而下解析的,function myFunc() { } 必须出现在 myFunc() 调用语句之前,否则解析器根本“没见过”这个函数名。
- 如果函数写在另一个文件里(比如
helpers.php),得用require_once 'helpers.php'或include 'helpers.php'先加载,推荐require_once防止重复包含导致Cannot redeclare function错误 - 命名空间里的函数要加前缀,比如
\MyApp\Utils\formatDate(),或者用use function MyApp\Utils\formatDate;导入后才能直接写formatDate() - 类中的方法不能直接用函数语法调用,
MyClass::doSomething()是静态调用,$obj->doSomething()是实例调用,都不是“函数调用”
传参不匹配会导致静默失败或警告
函数声明时有几个参数、是否带默认值、是否是引用传参(&$var),都会直接影响调用行为。
- 少传必填参数:触发
Warning: Missing argument(PHP 7+ 改为TypeError) - 多传参数:多余参数被忽略,不报错但可能逻辑异常
- 传了 null 或空字符串给期待数组的参数,可能导致
foreach() on null这类运行时错误 - 引用参数(
function process(&$data))调用时不能传字面量,比如process("abc")会报Only variables can be passed by reference
内置函数可以直接用,但要注意扩展依赖和大小写习惯
像 count()、json_encode()、file_get_contents() 这些不用 function 定义就能用,但不是所有都“永远可用”。
-
json_encode()需要json扩展启用,否则报Fatal error: Uncaught Error: Call to undefined function json_encode() - 多数内置函数不区分大小写(
COUNT([1,2])也能运行),但部分扩展函数(如某些数据库驱动)严格区分,建议统一小写避免混淆 -
echo和print是语言结构,不是函数,加括号只是语法糖(echo("hello")合法但没必要),而printf()才是真函数,必须加括号
调用前检查是否存在,能避开很多运行时崩溃
尤其在动态加载、插件机制或兼容旧版 PHP 的场景下,硬调用未定义函数等于主动抛出致命错误。
- 用
function_exists('my_util')判断后再调用,返回布尔值 - 对回调类型参数(比如传进
array_map()的函数名),务必用is_callable($callback)检查,它比function_exists()更全面(支持数组形式的['ClassName', 'method']和匿名函数) - 不要依赖
try-catch捕获Call to undefined function—— 这是Error,不是Exception,PHP 7+ 默认无法被catch捕获,除非用set_error_handler()转换或捕获Throwable
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











