Moodle插件PHP代码中$lastcron变量if判断逻辑正确性问询
逻辑解释与写法判断
变量含义说明
$lastcron是从数据库读取的该cron任务上次执行的时间戳,若任务从未运行过、数据库无对应记录,该变量会是PHP中的假值(false、0、null都属于假值范畴)$this->cron是预设的cron任务执行间隔,单位为秒time()是PHP内置函数,返回当前的Unix时间戳
原写法if (!$lastcron and ($lastcron + $this->cron < time()) )的问题
PHP中and为逻辑与运算符,要求左右两侧条件同时成立时整体判断结果才为真,且支持短路规则:如果左侧条件不成立,右侧条件不会执行,直接返回整体判断为假。
该写法存在明显逻辑缺陷:
- 当任务已经运行过、
$lastcron是有效时间戳(真值)时,左侧!$lastcron直接为假,整个判断永远不成立,哪怕已经到了预设的执行间隔,也不会触发后续逻辑 - 只有任务首次运行、
$lastcron为假值时,才会判断右侧条件,此时$lastcron等价于0,0 + $this->cron < time()在绝大多数场景下都成立,所以仅首次运行会触发逻辑,后续任务永远不会执行。
正确写法选择
首先明确该判断的核心业务目的:触发cron任务执行,常规有两种符合需求的写法:
- 若需要兼容首次运行场景(无上次执行记录也触发任务),应该将逻辑运算符换成逻辑或:
if (!$lastcron || ($lastcron + $this->cron < time()))
- 若确认
$lastcron一定会返回有效时间戳,只需要判断是否到了执行间隔,使用第二种写法即可:
if ($lastcron and ($lastcron + $this->cron < time()))
该写法逻辑为:先确认$lastcron是有效时间戳,再判断「上次执行时间+预设间隔」是否小于当前时间,即是否已经到了下次执行的时间点,符合常规cron任务的判断逻辑。
你给出的第一种!$lastcron搭配and的写法不符合常规cron任务的执行需求,是错误的。
内容的提问来源于stack exchange,提问作者luisdev
相关产品推荐
相关产品推荐

