跳转到主内容
极星编程网:以代码为星,赴技术山海!

PHP中mktime()函数参数类型错误的解决方案

php 升级后mktime()不再接受字符串参数,原代码将日期字符串直接传入导致typeerror,需改用time()或正确拆解时间组件。 mktime() 是一个用于根据指定的小时、分钟、秒、月、日、年生成 Unix 时间戳的函数,其所有参数 必须为整数类型 (int)。而你的代码中:
$ah = date("H:i:s Y-m-d"); $ahseg = mktime($ah);
$ah 是形如 "14:25:33 2024-06-15" 的字符串,将其整体作为第一个参数($hour)传给 mktime(),PHP 8.0+ 会严格校验类型并抛出致命错误: Fatal error: Uncaught TypeError: mktime(): Argument #1 ($hour) must be of type int, string given ⚠️ 关键原因 : 旧服务器可能运行 PHP 7.x(类型检查较宽松,部分版本会尝试 隐式转换 ); 新 Plesk 服务器默认启用较新 PHP 版本(如 8.0/8.1/8.2),启用了严格的类型检查(RFC: Strict Type Checks for Built-in Functions )。 ✅ 正确解决方案 : 立即学习 “ PHP免费学习笔记(深入) ”; 方案 1(推荐):如只需当前时间戳 → 直接用 time() PHP 8.5.5 PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。 下载
$ahseg = time(); // 返回当前 Unix 时间戳(秒级),简洁高效
方案 2:如需基于特定格式字符串构造时间戳 → 用 strtotime()
$ah = date("H:i:s Y-m-d"); // 例:"14:25:33 2024-06-15" $ahseg = strtotime($ah); // 自动解析字符串,返回时间戳(支持多种格式)
方案 3:坚持使用 mktime() → 手动提取整数参数
$now = getdate(); // 或用 date_parse() 解析 $ah 字符串 $ahseg = mktime( (int)$now['hours'], (int)$now['minutes'], (int)$now['seconds'], (int)$now['mon'], (int)$now['mday'], (int)$now['year'] ); // 或更安全地解析自定义字符串: $parts = date_parse("2024-06-15 14:25:33"); $ahseg = mktime( $parts['hour'], $parts['minute'], $parts['second'], $parts['month'], $parts['day'], $parts['year'] );
? 注意事项 : strtotime() 是处理日期字符串最常用、最健壮的方式,但需确保输入格式可被识别(如 "Y-m-d H:i:s" 安全兼容); 避免依赖 mktime() 接收非整数参数——这在任何现代 PHP 版本中都不应被视为有效行为; 在 Plesk 环境中,可通过「Websites & Domains」→「PHP Settings」确认并统一 PHP 版本,便于开发与生产环境一致。 总结:该错误本质是代码与新版 PHP 类型安全机制不兼容,修复核心在于 明确区分“获取当前时间”与“解析时间字符串”两种场景,并选用语义清晰、类型安全的函数替代模糊传参 。

相关文章