最近 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);

kt1ormo1.png

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 中间遇到的所有问题到目前已全部解决项目终于可以正常运行了