今天本地调用一个接口报错了:
filter_var(): explicit use of FILTER_FLAG_SCHEME_REQUIRED and FILTER_FLAG_HOST_REQUIRED is deprecated
但测试环境没有报错,于是查看了一下测试环境的 PHP 版本,是7.1.5,而我开发机的 PHP 版本是7.3.4。
再去看 PHP 手册关于 FILTER_FLAG_SCHEME_REQUIRED的介绍,Changelog里“赤裸裸”地写着:
7.3.0     The explicit usage of FILTER_FLAG_SCHEME_REQUIRED and FILTER_FLAG_HOST_REQUIRED has been deprecated.
好吧, FILTER_FLAG_SCHEME_REQUIRED 这个过滤器已经从7.3.0开始被弃用了,那就只能改造一下调用的方法了,代码如下:
private function prependMissingScheme($host) {
if (!filter_var($host, FILTER_VALIDATE_URL, FILTER_FLAG_SCHEME_REQUIRED)) {
$host = 'http://' . $host;
}
return $host;
}

FILTER_FLAG_SCHEME_REQUIRED是干嘛用的呢?可以看一下FILTER_VALIDATE_URL,它也是一个过滤器,把值作为 URL 来验证,有以下几个标识:

  • FILTER_FLAG_SCHEME_REQUIRED - 要求 URL 是 RFC 兼容 URL(比如 http://example)
  • FILTER_FLAG_HOST_REQUIRED - 要求 URL 包含主机名(比如 http://www.example.com)
  • FILTER_FLAG_PATH_REQUIRED - 要求 URL 在域名后存在路径(比如 www.example.com/example1/test2/)
  • FILTER_FLAG_QUERY_REQUIRED - 要求 URL 存在查询字符串(比如 "example.php?name=Peter&age=37")
也就是说,代码中的filter_val()方法是想判断变量 $host 有没有形似于“http://”或“https://”的内容,如果没有,就拼接一个“http://”字符串。
 
既然从7.3.0版本开始无法用FILTER_FLAG_SCHEME_REQUIRED了,可以用什么函数代替呢?翻手册找到了parse_url(),这个函数用来解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分。语法如下:
parse_url ( string $url [, int $component = -1 ] ) : mixed 
PHP手册关于parse_url()有这样一段说明:
Specify one of PHP_URL_SCHEME, PHP_URL_HOST, PHP_URL_PORT, PHP_URL_USER, PHP_URL_PASS, PHP_URL_PATH, PHP_URL_QUERY or PHP_URL_FRAGMENT to retrieve just a specific URL component as a string (except when PHP_URL_PORT is given, in which case the return value will be an integer).
看!PHP_URL_SCHEME!是不是和已经弃用的 FILTER_FLAG_SCHEME_REQUIRED 很像?!手册也给出了例子:
<?php
$url = 'http://username:password@hostname:9090/path?arg=value#anchor'; print_r(parse_url($url));
// Array ( [scheme] => http [host] => hostname [port] => 9090 [user] => username
[pass] => password [path] => /path [query] => arg=value [fragment] => anchor )

print_r(parse_url($url, PHP_URL_SCHEME)); // http
print_r(parse_url($url, PHP_URL_USER)); // username
print_r(parse_url($url, PHP_URL_PASS)); // password
print_r(parse_url($url, PHP_URL_HOST)); // hostname
print_r(parse_url($url, PHP_URL_PORT)); //
print_r(parse_url($url, PHP_URL_PATH)); // /path
print_r(parse_url($url, PHP_URL_QUERY)); // arg=value
print_r(parse_url($url, PHP_URL_FRAGMENT)); // anchor

所以可以用parse_url()函数配合 PHP_URL_SCHEME 验证即可。

private function prependMissingScheme($host){
// 也可以写成
// if (!isset(parse_url($host)['scheme'])) {
if (empty(parse_url($host, PHP_URL_SCHEME)) {
$host = 'http://' . $host;
}
return $host;
}

需要注意的是,parse_url()不能验证给定 URL 的合法性,只是将给定的 URL 分解为上面列出的各部分。不完整的 URL 也被接受,parse_url()会尝试尽量正确地将其解析。

PHP7.3.0+弃用FILTER_FLAG_SCHEME_REQUIRED的解决办法的更多相关文章

  1. Android权限管理之Android 6.0运行时权限及解决办法

    前言: 今天还是围绕着最近面试的一个热门话题Android 6.0权限适配来总结学习,其实Android 6.0权限适配我们公司是在今年5月份才开始做,算是比较晚的吧,不过现在Android 6.0以 ...

  2. JavaScript中的ParseInt("08")和“09”返回0的原因分析及解决办法

    今天在程序中出现一个bugger ,调试了好久,最后才发现,原来是这个问题. 做了一个实验: alert(parseInt("01")),当这个里面的值为01====>07时 ...

  3. Linux 出现telnet: 127.0.0.1: Connection refused错误解决办法

    Linux 出现telnet: connect to address 127.0.0.1: Connection refused错误解决办法 没有xinetd服务: 1./etc/init.d目录中放 ...

  4. The specified framework 'Microsoft.NETCore.App', version '1.0.1' was not found 解决办法

    环境:Centos 7 已经下载安装.NET Core 1.1 Microsoft .NET Core Shared Framework Host Version : Build : 928f77c4 ...

  5. VC++6.0打开文件出错的解决办法

    1.下载http://support.microsoft.com/kb/241396里面的一个叫FileTool.exe的文件并解压,解压后是一个vc工程,用vc6.0打开工程,编译,得到FileTo ...

  6. 转:Selenium2.0 click()不生效的解决办法

    除了http://573301735.com/?p=5126讲的,昨天又发现一个让我1个小时生不如死的问题,就是使用两个不同的配置文件来初始化driver,findelement方法获取到的坐标居然不 ...

  7. 对‘TIFFReadDirectory@LIBTIFF_4.0’未定义的引用-------------- 解决办法

    ABLE_DEPRECATED' is defined [-Winvalid-pch] //usr/lib/libvtkIO.so.5.10:对‘TIFFReadDirectory@LIBTIFF_4 ...

  8. Unity3d导入3dmax后model 的缩放为0.0254的原因以及解决办法

    http://blog.csdn.net/pdw_jsp/article/details/51259493 这个问题其实已经早都出现过了,今天我们这边也碰到了,这里做个记录吧 导致的问题~ 场景的比例 ...

  9. DotNetCore.1.0.1-VS2015Tools.Preview2.0.3 相关问题及解决办法

    本月16号,MS发布了 .NET Core 1.1.作为一个用贯MS产品的小盆友,我第一时间就把相关的安装包下载下来了,然后果断安装(入坑). 我猜你来看这篇博客可能遇到了和我一样的问题. 问题0:正 ...

随机推荐

  1. phpstorm分别在Mac和Windows下启动命令行,并启用ssh

    Mac:在terminal下运行 sudo -i 输入密码  就可以用ssh IP:端口  命令行登录了 DAssist是一个命令行开发辅助,可直接在系统命令行工具中使用,Linux和MacOS等自带 ...

  2. 记录OKR在小公司实施的一次经历

    00 前言 前段时间看了本书叫<OKR工作法>,顺便了解了一下OKR的相关知识,感觉这个起源于英特尔公司的东西,正是为那种小而美的团队准备的好东东.如果你还不知道什么是OKR,那我给你个传 ...

  3. Detectron2源码阅读笔记-(三)Dataset pipeline

    构建data_loader原理步骤 # engine/default.py from detectron2.data import ( MetadataCatalog, build_detection ...

  4. CentOS6.10下yum安装MySQL5.7

    MySQL官网的Yum仓库快速指南:https://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/ 检查是否安装有MySQL数据库 rpm -qa | ...

  5. 【Hadoop】集群网络

  6. 排序算法-插入排序(Java)

    package com.rao.linkList; import java.util.Arrays; /** * @author Srao * @className InsertSort * @dat ...

  7. mysql命令查询语句&MTdata

    1.单表查询 select * from student; 采用*效率低,不推荐,多用列名 一.单表查询的语法: SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY ...

  8. Hibernate框架学习1

    框架是什么 1.框架是用来提高开发效率的 2.封装了好了一些功能.我们需要使用这些功能时,调用即可.不需要再手动实现. 3.所以框架可以理解成是一个半成品的项目.只要懂得如何驾驭这些功能即可. orm ...

  9. Pandas | 14 统计函数

    统计方法有助于理解和分析数据的行为.可以将这些统计函数应用到Pandas的对象上. pct_change()函数 系列,DatFrames和Panel都有pct_change()函数.此函数将每个元素 ...

  10. Python模块 --- 最高级别程序组织单元

    模块 --- 最高级别程序组织单元 <Python学习手册>笔记 import 导入1个模块 from 获取模块指定变量名 imp.reload 重新载入模块文件代码的方法 模块作用 代码 ...