PHP内置函数开箱即用,无需声明或导入;自定义函数需确保已定义或通过require_once加载;命名空间函数须带前缀或use导入;回调需注意作用域与存在性验证。
PHP 的内置函数(如 strlen()、array_merge()、date())开箱即用,只要 PHP 版本支持,写完就能执行。不用 import、不用 require,也不用注册或初始化。
常见错误是误以为要“启用”某个函数——比如看到 json_encode() 报错 Call to undefined function json_encode(),其实不是调用方式错了,而是 JSON 扩展根本没开启。这时候该查 phpinfo() 或 extension_loaded('json'),而不是改
调用语法。
strlen("hello") 返回 5,直接写就跑strlen() 会警告并返回 0,不是报致命错误,容易漏掉自定义函数不能“跨文件自动可见”。如果函数定义在另一个文件里(比如 utils.php),当前脚本必须显式引入,否则会触发 Fatal error: Uncaught Error: Call to undefined function xxx()。
推荐用 require_once 而非 include,避免重复定义导致的 Cannot redeclare 错误;也不要依赖自动加载——函数不走 autoload 机制,类才走。
my_log("start");
require_once 'helpers.php';
my_log("done");require_once 'Helper.php' 和实际文件名 helper.php 在 Linux 下就是两个文件PHP 5.6+ 支持函数级命名空间,但不像类那样能用 use 简写函数名(除非 PHP 7+ 用 use function)。不加前缀直接调用,PHP 默认找全局空间,找不到就报错。
比如 MyLib\format_date() 定义在命名空间下,以下写法都不行:format_date()、\format_date()(这是全局空间)、MyLibformat_date()(少反斜杠)。
MyLib\format_date('Y-m-d')
use function MyLib\format_date;
format_date('Y-m-d');use function MyLib\format_date as fmt;
fmt('Y-m-d');把函数当参数传(如 array_map()、usort()),不是“调用它”,而是“告诉 PHP 稍后用这个函数处理数据”。这时候容易犯两类错:变量不可见、或函数本身没定义。
闭包捕获外部变量要用 use,否则报 Undefined variable;而字符串形式的函数名(如 'trim')必须是已存在的全局函数或静态方法,不能是普通对象方法或未加载的函数。
$prefix = 'user_';
$map = function($id) use ($prefix) {
return $prefix . $id;
};
array_map($map, [1, 2]); // ['user_1', 'user_2']array_filter($arr, 'MyClass::method') 会失败,得写成 [MyClass::class, 'method'] 或闭包包装if (function_exists($cb)) { call_user_func($cb, $arg); }