PHP8.1升级:弃用each()解决mktime()问题
本篇文章向大家介绍《PHP 8.1 升级指南:弃用 each() 解决 mktime() 错误》,主要包括,具有一定的参考价值,需要的朋友可以参考一下。

本文旨在指导开发者如何将旧版PHP代码中的 `each()` 函数安全地迁移到 `foreach()` 结构,并重点解决在PHP 8.1环境下常见的 `mktime()` 函数因类型不匹配导致的 `TypeError`。我们将详细解释 `explode()` 返回字符串数组与 `mktime()` 期望整型参数之间的冲突,并提供使用显式类型转换 `(int)` 的解决方案,确保代码在现代PHP版本中稳定运行。
PHP 8.1 升级:从 each() 到 foreach() 的迁移与常见类型错误解析
随着PHP版本的不断演进,一些旧有的函数和语法已被废弃或移除,以提升语言的性能、安全性和一致性。其中,each() 函数在PHP 7.2中被废弃,并在PHP 8.0中彻底移除。因此,对于需要将旧项目升级到PHP 8.1或更高版本的开发者而言,将代码中的 each() 替换为 foreach() 循环是必不可少的一步。
1. each() 函数的废弃与 foreach() 的替代
在旧版PHP中,each() 函数常与 while 循环结合使用,用于遍历数组,每次迭代返回当前元素的键值对。其典型用法如下:
while (list($key, $value) = each($array)) {
// 处理 $key 和 $value
}然而,each() 存在性能和语义上的局限性,并且随着PHP语言的发展,更简洁、高效的 foreach() 循环成为了遍历数组的首选方式。foreach() 循环直接提供了对数组键和值的访问,无需额外的函数调用,代码可读性更强。
将上述 each() 循环转换为 foreach() 的正确方式是:
foreach ($array as $key => $value) {
// 处理 $key 和 $value
}注意事项: 在进行 each() 到 foreach() 的转换时,如果原始数组 $array 存在为空或非数组的可能,为了避免PHP 8.1中可能出现的 TypeError(当 foreach 尝试遍历非数组或不可遍历的值时),建议在 foreach 之前进行类型检查或强制转换为数组。例如:
// 原始代码片段
// while (list($uhrzeit, $value) = each($wrdata)) { ... }
// 转换为 foreach 并进行类型安全处理
foreach ((array) $wrdata as $uhrzeit => $value) {
// ... 循环体内容
}通过 (array) $wrdata 强制类型转换,即使 $wrdata 为 null 或其他非数组类型,也会被安全地转换为一个空数组,从而避免 foreach 报错。
2. 解决 mktime() 函数的 TypeError
在将代码从PHP 7.4升级到PHP 8.1时,仅仅替换 each() 可能不足以解决所有问题。一个常见的错误是 mktime() 函数引发的 TypeError,提示其参数必须是 int 类型,但实际接收到了 string 类型。
错误示例:
Fatal error: Uncaught TypeError: mktime(): Argument #1 ($hour) must be of type int, string given in /path/to/your/file.php:106
Stack trace: #0 /path/to/your/file.php(106): mktime('', NULL, NULL, '12', '08', '10') #1 ...这个错误信息清晰地表明,mktime() 函数的第一个参数($hour)期望一个整数,但实际传入了一个字符串。结合原始代码,问题通常出现在时间字符串的解析和使用上:
$time_split = explode(":", $uhrzeit);
$timestamp = mktime ($time_split[0], $time_split[1], $time_split[2], $month, $day, $year );这里的 $uhrzeit 通常是一个时间字符串(例如 "10:30:00")。explode(":", $uhrzeit) 函数会将其分割成一个字符串数组,例如 ['10', '30', '00']。在旧版PHP中,字符串在某些上下文中会被隐式地转换为数字,但PHP 8.1 对类型检查更为严格,不再允许这种隐式转换,因此 mktime() 会抛出 TypeError。
解决方案:显式类型转换
解决此问题的方法是使用显式类型转换,确保传递给 mktime() 的参数都是整数类型。可以通过在变量前加上 (int) 来实现。
$time_split = explode(":", $uhrzeit);
$timestamp = mktime(
(int)$time_split[0], // 强制转换为整数:小时
(int)$time_split[1], // 强制转换为整数:分钟
(int)$time_split[2], // 强制转换为整数:秒
$month,
$day,
$year
);通过 (int)$time_split[0] 等操作,我们将 explode() 返回的字符串数组元素显式地转换成了整数,从而满足了 mktime() 函数的参数类型要求。
为什么需要显式转换?explode() 函数根据分隔符将字符串拆分为一个字符串数组。例如,explode(":", "10:30:45") 将返回 ['10', '30', '45'],其中的 '10'、'30'、'45' 都是字符串类型。而 mktime() 函数,顾名思义,是用于创建Unix时间戳的,其小时、分钟、秒等参数都必须是整数。PHP 8.1 强化了类型严格性,不再容忍这种潜在的类型不匹配,因此需要开发者手动进行类型转换。
3. 升级过程中的其他注意事项
在进行PHP版本升级时,特别是从旧版本(如PHP 7.x)升级到PHP 8.x,可能会遇到更多类似的类型错误或其他兼容性问题。
- 阅读官方迁移指南: PHP官方提供了详细的迁移指南(例如 PHP 8.1 迁移指南),其中列举了所有向后不兼容的变更、废弃的功能和新增的特性。这是解决升级问题的最佳起点。
- 关注错误日志: PHP 8.1 的错误报告更为详细和准确。仔细阅读 Warning、Error 和 Fatal error 信息,它们通常会直接指出问题所在,包括文件名、行号以及期望的类型与实际接收到的类型。
- 逐步升级与测试: 建议不要一次性升级所有代码。可以考虑在开发环境中逐步修复问题,并进行全面的单元测试和集成测试,确保所有功能在新的PHP版本下都能正常运行。
- 使用静态分析工具: PHPStan、Psalm 等静态分析工具可以在代码运行前发现潜在的类型错误、废弃函数使用等问题,为升级提供有力帮助。
总结
将旧版PHP代码迁移到PHP 8.1及更高版本,主要涉及到对废弃功能的替换(如 each() 到 foreach())以及对类型严格性增强的适应(如 mktime() 参数的显式类型转换)。理解这些变化背后的原因,并遵循官方指南和最佳实践,将有助于开发者顺利完成代码升级,使应用程序在现代PHP环境中更加健壮和高效。始终记住,详细的错误信息是解决问题的关键线索,而显式类型转换则是应对PHP 8.1严格类型检查的有效策略。
好了,本文到此结束,带大家了解了《PHP8.1升级:弃用each()解决mktime()问题》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多文章知识!
Win11关闭通知设置教程
- 上一篇
- Win11关闭通知设置教程
- 下一篇
- 邮编与地址对应关系全解析
-
- 文章 · php教程 | 3小时前 | php教程 · php Symfony OptionsResolver setAllowedTypes setAllowedValues
- PHP OptionsResolver怎么限制选项类型和允许值
- 114浏览 收藏
-
- 文章 · php教程 | 3小时前 |
- PHP PropertyAccess遇到缺失属性怎么处理
- 151浏览 收藏
-
- 文章 · php教程 | 3小时前 | PHP · Symfony 嵌套对象 PHP PropertyAccess getValue 属性路径
- PHP PropertyAccess怎样读取嵌套对象属性
- 368浏览 收藏
-
- 文章 · php教程 | 3小时前 |
- PHP Process总超时与空闲超时有什么区别
- 188浏览 收藏
-
- 文章 · php教程 | 3小时前 | 工程实践 · php教程 · 进程管理 · 参数数组 proc_open PHP Symfony Symfony Process PHP子进程
- PHP Symfony Process怎样使用参数数组启动子进程
- 243浏览 收藏
-
- 文章 · php教程 | 3小时前 | php foreach 大目录 Symfony Finder
- PHP Finder迭代大目录时如何避免一次载入全部结果
- 495浏览 收藏
-
- 文章 · php教程 | 3小时前 |
- PHP Symfony Finder怎么组合文件名与目录过滤
- 102浏览 收藏
-
- 文章 · php教程 | 3小时前 | PHP · filter PHP DomCrawler filterXPath children siblings ancestors closest
- PHP DomCrawler筛选节点和遍历子节点有什么区别
- 231浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 463次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 526次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 544次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 493次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 311次使用
-
- PHP JSON_THROW_ON_ERROR 抛错后怎么保留原始字段位置
- 2026-09-09 501浏览
-
- PHP 8.5 array_last() 怎么处理空数组:从 null 结果到兼容旧版本的 Polyfill
- 2026-08-16 501浏览
-
- 宝塔配置Ruby环境:RVM+Nginx反代教程
- 2026-05-29 501浏览
-
- unset函数作用范围详解
- 2026-05-29 501浏览
-
- VS Code配置Xdebug教程:PHP调试技巧全解析
- 2026-05-13 501浏览

