FILTER_FLAG_SCHEME_REQUIRED已弃用,因FILTER_VALIDATE_URL自PHP 7.3起默认强制要求scheme和host;应移除该flag,改用parse_url()判断并补全scheme。

filter_var() 报 deprecated 警告:FILTER_FLAG_SCHEME_REQUIRED 已失效
PHP 7.3.0 起,FILTER_FLAG_SCHEME_REQUIRED 和 FILTER_FLAG_HOST_REQUIRED 被明确弃用,调用 filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_SCHEME_REQUIRED) 会触发 filter_var(): explicit use of FILTER_FLAG_SCHEME_REQUIRED ... is deprecated 警告。这不是语法错误,但会影响生产环境日志和错误监控 —— 尤其在 error_reporting 包含 E_DEPRECATED 时。
为什么不能继续用?FILTER_VALIDATE_URL 本身已隐含 scheme 和 host 检查
PHP 官方说明很直接:从 7.3 开始,FILTER_VALIDATE_URL 默认就要求 URL 含 scheme(如 http://)和 host(如 example.com),不再需要显式传入这两个 flag。也就是说:
-
filter_var('example.com', FILTER_VALIDATE_URL)→ 返回false(无 scheme,不合法) -
filter_var('http://example.com', FILTER_VALIDATE_URL)→ 返回http://example.com(合法) - 加
FILTER_FLAG_SCHEME_REQUIRED不改变行为,只触发弃用警告
替代方案:用 parse_url() 提取 scheme 判断是否缺失
如果原逻辑是「检测 URL 是否缺 scheme,缺则补 http://」,推荐改用 parse_url() + isset() 判断:
示例代码:
function prependMissingScheme($url) {
$parts = parse_url($url);
if (!isset($parts['scheme'])) {
return 'http://' . ltrim($url, '/');
}
return $url;
}
注意点:
-
parse_url()对非法 URL(如纯域名)返回false,需先判空再访问$parts['scheme'] -
ltrim($url, '/')避免补成http:///example.com - 不建议用正则匹配开头(如
^https?://),因为 URL 可能含 userinfo、端口等变体,parse_url()更健壮
兼容旧版 PHP 的写法(不推荐长期使用)
若项目需同时支持 PHP
if (version_compare(PHP_VERSION, '7.3.0', '>=') && defined('FILTER_FLAG_SCHEME_REQUIRED')) {
// 不传 flag,直接用 FILTER_VALIDATE_URL
$valid = filter_var($url, FILTER_VALIDATE_URL);
} else {
// 旧版才用 flag
$valid = filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_SCHEME_REQUIRED);
}
但这种写法增加维护成本,且新版 PHP 已彻底移除该常量的语义作用——真正要保留的是业务逻辑(比如「补 scheme」),不是 flag 本身。
最易被忽略的一点:很多代码把 FILTER_FLAG_SCHEME_REQUIRED 当作「允许无 scheme」的开关,其实它从来不是;它只是冗余声明。删掉它,FILTER_VALIDATE_URL 行为不变,只是不再报 warning。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











