PHP中false常因松散比较误判合法值,如array_search返回0被当作false,须用!== false;file_exists在NFS或权限问题下失效,需clearstatcache、用绝对路径并检查权限。

绝大多数情况下,PHP判断结果为 false 并不是函数“错了”,而是你用松散比较(== 或隐式布尔转换)误判了合法的返回值,比如 0、''、null 或数组键 0。
array_search 返回 0 却被当成 false
当目标值在数组首位(索引为 0)时,array_search() 正确返回 0,但 if ($key) { } 会跳过执行——因为 0 是假值。
- 必须用严格比较:
if ($key !== false),而不是if ($key) - 若不确定数组是否为空或是否为数组,先加
is_array($haystack) && !empty($haystack) - 搜索字符串
'0'时,注意它和整数0类型不同;需传true启用严格模式:array_search('0', $arr, true)
file_exists 在 NFS 或权限受限路径下总返回 false
文件物理存在,但 file_exists() 返回 false,常见于挂载目录或权限配置不当。
- 先调用
clearstatcache(true, $path)清除该路径的 stat 缓存(OPcache 可能缓存旧结果) - 改用绝对路径:
$path = __DIR__ . '/data/config.json',避免相对路径随chdir()变化 - 检查 Web 用户(如
www-data)是否有目录执行权(x)和文件读权(r);open_basedir限制也会导致直接拒绝访问 - 对 NFS/SMB 路径,不要只依赖一次
file_exists(),可加简单重试:for ($i = 0; $i
in_array 判断失败却查不到原因
明明数组里有 '1',in_array(1, $arr) 却返回 false?这是松散比较把字符串 '1' 和整数 1 当作相等,但反过来——查找整数 1 时,若数组中只有字符串 '1',它其实会返回 true;真正失效常发生在类型混淆更隐蔽的场景。
立即学习“PHP免费学习笔记(深入)”;
- 典型陷阱:
in_array(0, ['a', 'b'])返回true——因为'a'被转成0后匹配成功 - 修复方式:始终启用严格模式:
in_array($needle, $haystack, true) - 若需忽略大小写,别直接用
in_array(strtolower($n), array_map('strtolower', $h)),而应先trim()去空格,再统一转小写,否则前后空格会导致匹配失败
is_uploaded_file 和 move_uploaded_file 总是 false
这两个函数返回 false 几乎从不因为代码写错,而是环境或流程断点出了问题。
- 必须前置检查:
$_FILES['file']['error'] === UPLOAD_ERR_OK;任何非0错误码(如UPLOAD_ERR_INI_SIZE)都会让后续函数失效 -
is_uploaded_file()要求参数是$_FILES['x']['tmp_name']的原始值,不能经过realpath()或拼接处理 -
move_uploaded_file()的目标目录必须存在、可写,且父目录要有执行权限(x),否则即使chmod 777目录本身也无效 - 临时目录(
sys_get_temp_dir())若被清理或权限异常,会导致上传文件根本没落盘,tmp_name为空或非法,此时is_uploaded_file()必然返回false
最易被忽略的一点:PHP 的假值列表(0、''、null、false、[]、"0")在布尔上下文中全部坍缩为 false,但它们语义完全不同。用 === 或显式类型检查(如 is_int($v) && $v === 0)才能守住边界。



















