PHP5升级至7.4后PEAR的HTML_Template_IT/ITX调用报错页面空白问题
问题根源
- 原代码调用
$this->HTML_Template_ITX()是PHP4时代的父类构造函数调用写法,PHP5仅做向下兼容支持,PHP7.0之后正式废弃了PHP4风格的构造函数(与类名同名的方法作为构造函数),子类显式定义__construct后,无法再通过调用父类同名方法执行构造逻辑,因此抛出方法不存在的错误。 - 自行修改为
new HTML_Template_ITX()的逻辑错误:你的siteMainTemplate本身已经继承自HTML_Template_ITX,不需要额外创建新的ITX实例存到$this->template。你修改后只是创建了新实例但完全没有使用,当前子类实例本身没有执行父类构造函数做初始化,所有ITX依赖的内部属性(模板路径、块解析规则、正则匹配规则等)均为空,因此出现正则为空、属性未定义的报错。 - 构造函数参数不匹配:你在
somesite.php中实例化siteMainTemplate时只传了1个参数,但子类__construct定义要求传入2个参数,PHP7对参数校验的严格度高于PHP5,也会触发隐式报错。
修正方案
第一步:修改子类构造函数逻辑,正确调用父类构造
修改classdefs.php代码如下:
<?php //=== classdefs.php ===// require_once "../PEAR/ITX.php"; class siteMainTemplate extends HTML_Template_ITX { // 给第二个参数加默认值,兼容旧的单参数调用逻辑 function __construct($pageBody, $pageTitle = '') { // 调用父类构造函数,传入模板根目录 parent::__construct("../templates/"); // 原[...]中的业务逻辑,比如加载传入的模板文件 $this->loadTemplatefile($pageBody); // 页面标题相关的原有逻辑 if (!empty($pageTitle)) { $this->setVariable("PAGE_TITLE", $pageTitle); } } function showSite() { $this->show(); } } ?>
第二步:调整实例化调用参数(可选)
如果你的业务逻辑需要传入页面标题,可将somesite.php中的实例化代码调整为传入两个参数:
$template = new siteMainTemplate("article.tpl", "你的自定义页面标题");
修改完成后,原有setCurrentBlock、setVariable、parseCurrentBlock、showSite等调用逻辑无需修改,可直接正常运行。
额外注意
如果修改后仍有报错,可检查你使用的PEAR HTML_Template_IT/ITX包的版本,过老的版本可能存在其他PHP7+不兼容的语法(比如已废弃的ereg系列函数),升级到PEAR官方最新的兼容版本即可。
内容的提问来源于stack exchange,提问作者floyd80
相关产品推荐
相关产品推荐

