aliyunoss php8.*+ null值报错
前言
最近在使用阿里云的 OSS 服务时,发现了一些问题。
当php版本高于8.0的时候 src/OSS/SignerV1.php
中会出现 null
值错误。issue地址
目前已解决。各位更新 2.7.1
版本即可。
问题原因
line 17-20
1 | // Credentials information |
1 |
|
$token
是一个可选参数,当没有传入时,$token
的值是 null
,所以在 SignerV1.php
中的 strlen($credentials->getSecurityToken())
会报错。
line 25-27
1 | $queryString = parse_url($request->request_url, PHP_URL_QUERY); |
这3行代码目的是将url中的参数解析成数组,但是当url中没有参数时,parse_url
返回的是 null
,parse_str
无法解析 null
,所以会报错。
解决方案
只能修改源码,将 null
值的判断加上。
line 17-20
1 | // Credentials information |
line 25-27
1 | $queryString = parse_url($request->request_url, PHP_URL_QUERY); |
但是我个人比较好奇其他语言的源码是怎么写的,所以我去看了一下 java
的源码,发现 java
的源码中对 null
值的判断是有的。
下面是 java
对于 SecurityToken
的源码部分。1
2
3public String getSecurityToken() {
return securityToken;
}1
2
3public void setSecurityToken(String securityToken) {
this.securityToken = securityToken;
}1
2
3public boolean hasSecurityToken() {
return securityToken != null;
}
也就是说,在 SignerV1
中,获取 SecurityToken
的时候,会先判断 SecurityToken
是否为 null
,如果不为 null
才会执行后续的操作。
但 php
的源码中没有对 null
值的判断,所以会报错。
总结
开猿节流的BUG