X3.2 升级为 X3.5,PHP 8, 报错 array_diff(): Argument #1 ($array) must be of type array, null given
求老大帮帮忙~问题描述:
Discuz X3.2 UTF 升级 Discuz X3.5 UTF,
升级时用的PHP5.6,整个升级都挺顺利。
升级后,
PHP 5.6 时,运行良好,
PHP 7.3,运行良好,
PHP 8.0 时,点击 “主题: 0, 帖数: 0”的版块,运行良好;
但是,PHP 8.0 时,点击“主题不为0、帖数不为0”的版块(比如“ 主题: 5, 帖数: 5”)时,会报错如下:
我的网站是:http://70008000.com,
求老大帮我看看,多谢!
我知道答案 回答被采纳将会获得1 贡献 已有0人回答 出现这个报错的原因是X3.5版本中部分代码对PHP8的严格类型检查支持不完善。针对"array_diff(): Argument #1 ($array) must be of type array, null given"这个具体错误,可以通过以下步骤解决:
1. 打开文件:source/module/forum/forum_forumdisplay.php
2. 找到约第934行附近(不同版本可能略有差异)的代码:
$stickytids = array_diff($stickytids, $_G['forum_threadlist']);
3. 修改为:
$stickytids = is_array($stickytids) ? array_diff($stickytids, (array)$_G['forum_threadlist']) : [];
这个修改做了两处改进:
- 增加对$stickytids的数组类型校验
- 对第二个参数做强制数组类型转换
- 当$stickytids非数组时返回空数组避免null传递
如果修改后仍有问题,建议按以下步骤排查:
1. 进入后台->工具->更新缓存
2. 检查数据表pre_forum_forum中的threadcaches字段是否存在异常值
3. 在php8环境下运行后台的「工具->文件校验」功能
4. 检查是否使用了未适配X3.5的老旧插件
该问题属于X3.5在PHP8环境下的兼容性优化范畴,我们DZ插件网已针对这类升级问题整理了专项修复补丁包,可通过技术客服通道获取。建议在处理此类核心文件修改时,使用diff工具做好修改记录以便后续升级维护。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。 你好,根据你描述的问题,报错信息是 `array_diff(): Argument #1 ($array) must be of type array, null given`,这个错误通常是由于在 `array_diff()` 函数中传入了一个 `null` 值,而不是一个数组。在 PHP 8 中,类型检查更加严格,因此会抛出这个错误。
### 问题分析:
1. **PHP 8 的类型检查**:PHP 8 对函数参数的类型检查更加严格,如果传入的参数类型不符合要求,会直接抛出错误。
2. **Discuz X3.5 的兼容性**:Discuz X3.5 虽然支持 PHP 8,但在某些情况下,可能仍然存在一些代码没有完全适配 PHP 8 的情况。
### 解决方案:
1. **定位问题代码**:
- 你需要找到报错的具体位置。根据报错信息,问题出在 `array_diff()` 函数调用时,第一个参数是 `null`。
- 你可以通过调试工具或日志来定位具体的代码位置。
2. **修复代码**:
- 找到问题代码后,确保在调用 `array_diff()` 之前,传入的参数是一个数组。如果可能为 `null`,可以在调用前进行判断并处理。
例如:
if (is_array($array1) && is_array($array2)) {
$result = array_diff($array1, $array2);
} else {
// 处理异常情况,比如给 $result 赋一个默认值
$result = [];
}
3. **检查插件或模板**:
- 如果你使用了第三方插件或模板,可能是这些插件或模板没有完全适配 PHP 8。你可以尝试禁用插件或切换默认模板,看看问题是否依然存在。
- 如果问题确实是由插件或模板引起的,建议联系插件的开发者或模板的作者,获取更新版本。
4. **升级到最新版本**:
- 确保你使用的是 Discuz X3.5 的最新版本,因为官方可能会修复一些与 PHP 8 兼容性相关的问题。
5. **临时解决方案**:
- 如果你暂时无法修复代码,可以考虑在 PHP 8 中降低错误报告的级别,或者使用 `@` 操作符来抑制错误。但这只是临时解决方案,不建议长期使用。
error_reporting(E_ALL & ~E_WARNING);
或者:
$result = @array_diff($array1, $array2);
### 总结:
这个问题主要是由于 PHP 8 对类型检查更加严格导致的。你需要找到具体的代码位置,并确保传入 `array_diff()` 的参数是一个数组。如果问题是由插件或模板引起的,建议联系开发者获取更新版本。
希望这些建议能帮助你解决问题!如果还有其他问题,欢迎继续提问。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页:
[1]