解决php7.4后升级安装使用ThinkPHP5.*异常
最近 php7.4 发布了,公司的大项目之前使用 php7.0 要跟随时代的潮流升级到最新的 7.4 体验下 7.4新特性 预加载 据测试开始并使用预加载后整体性能提升机 34% 左右还是很值的升级的因为这个项目使用的 ThinkPHP5. 所以说在升级的过程中出了一些状况特此记录下,后来发现不但升级时候会出现,在 7.4 环境下安装 ThinkPHP5. 也会出现大致统计了下为一下几个问题:
Array and string offset access syntax with curly braces is deprecated
首先映入眼帘的是 Array and string offset access syntax with curly braces is deprecated 异常,该异常信息一般发生在新安装或者使用中升级PHP版本问题,问题由 ThinkPHP5.* 抛出主要是因为php7.4以上版本废弃了 数组{} 语法导致的
解决方案:
我们只需要 全局搜索 并替换下 数组{}写法 为 [] 即可,ThinkPHP5.* 框架相关位置主要在 thinkphp/library/think/db/Query.php:400 这个地方我们只需要改为下面语法即可
$seq = (ord($value[0]) % $rule['num']) + 1;
Trying to access array offset on value of type null
改完上述问题后我们接着往下执行发现又爆出了 Trying to access array offset on value of type null 异常,该异常信息主要是因为在一个空的对象里面使用了数组 key 访问数据的 value 所导致的。
$var = null;
echo $var['xx'];
解决方案:
我们只需要在访问数组前判断下是否存在,然后给定一个默认值即可
$var = null;
echo $var['xx']??'default';
redis 缓存器 delete 方法不兼容问题
因为最新的 php 版本里面 redis扩展 已经废弃了 delete方法 这个时候我们只需要在使用到的地方替换的 redis 方法即可
解决方案:
在 ThinkPHP5.* 框架 \think\cache\driver\Redis::rm 和 \think\cache\driver\Redis::clear 位置替换下redis方法即可。
$this->handler->del($key);
The (real) cast is deprecated, use (float) instead
最后我们发现处理完以上问题后还是报 The (real) cast is deprecated, use (float) instead 异常,检查后发现 (real) 也已经被最新版本的php废弃了我们可以使用 floatval() 或 (float) 来代替
解决方案:
$price="99.99";
$price = (float)price;
好了关于项目 ThinkPHP5.* 框架 升级使用 php7.4 中间遇到的所有问题到目前已全部解决项目终于可以正常运行了
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。