PHP 7.2未定义常量错误求助:PHP 7.1无E_WARNING提示
嘿,我来帮你搞定这个PHP版本升级后的警告问题~你在PHP 7.2里碰到的Use of undefined constant警告,是因为PHP 7.2对未定义常量的检测比7.1严格多了——在7.1里这种情况只会默默把它当成字符串处理,但7.2开始会抛出警告,未来版本甚至会直接报错。
先把你遇到的错误信息列出来,方便定位:
[12-Jan-2018 22:44:20 America/Toronto] PHP Warning: Use of undefined constant MODULE_HEADER_SELECT_TEMPLATE_STATUS - assumed 'MODULE_HEADER_SELECT_TEMPLATE_STATUS' (this will throw an Error in a future version of PHP) in /var/www/clients/client1/web13/web/boutique/includes/Sites/Shop/Template.php 第356行
关联文件:/web13/web/boutique/includes/Sites/Shop/NavigationHistory.php 第39行
接下来给你几个具体的解决步骤,按顺序排查就行:
第一步:确认常量是否被定义
首先得搞清楚MODULE_HEADER_SELECT_TEMPLATE_STATUS这个常量有没有在代码里定义过。这类和模块相关的常量,一般会在配置文件(比如configure.php)、模块初始化文件里定义,或者是从数据库读取配置后赋值的。
你可以在Template.php的第356行之前,加一段调试代码验证:if (!defined('MODULE_HEADER_SELECT_TEMPLATE_STATUS')) { error_log('MODULE_HEADER_SELECT_TEMPLATE_STATUS 未定义'); // 也可以打印所有已定义常量来排查 // print_r(get_defined_constants()); }如果确认没定义,那就补上常量定义,比如根据实际需求设置值:
define('MODULE_HEADER_SELECT_TEMPLATE_STATUS', 'true'); // 比如设置为启用状态,或者根据你的业务逻辑改值第二步:检查是不是变量名写错了
有时候可能是手滑把变量写成了常量(漏了$符号)。如果原本应该是变量$MODULE_HEADER_SELECT_TEMPLATE_STATUS,那只要把常量引用改成变量,加上$就行:// 把原来的 MODULE_HEADER_SELECT_TEMPLATE_STATUS 改成 $MODULE_HEADER_SELECT_TEMPLATE_STATUS第三步:临时兼容写法(不推荐长期用)
如果你暂时不想修改核心代码,可以先用defined()函数做判断,避免警告弹出:$templateStatus = defined('MODULE_HEADER_SELECT_TEMPLATE_STATUS') ? MODULE_HEADER_SELECT_TEMPLATE_STATUS : 'default';不过这只是过渡方案,最好还是找到根源补上定义,不然未来PHP版本升级肯定会出问题。
第四步:检查模块的安装配置
从常量名来看,这应该是和“头部模板选择模块”相关的配置。如果你用的是Zen Cart这类电商系统,大概率是这个模块没正确安装,或者对应的配置项没导入到数据库里。你可以去后台的模块管理页面,检查这个模块是否启用,对应的配置项是否存在。如果是从数据库读取配置的话,要确保初始化代码正常读取并定义了这个常量。
内容的提问来源于stack exchange,提问作者Ruzo

