PEAR HTML_Template_IT/HTML_Template_ITX с PHP 7.4 приводит к пустой странице

#php #pear

Вопрос:

Один из моих проектов использует пакет PEAR HTML_Template_IT плюс его расширение HTML_Template_ITX. Код работал до давно назревшего перехода с PHP 5 на PHP 7.4. Теперь у нас возникают проблемы со ссылкой на HTML_Template_ITX() из расширяющегося класса. Реализация в двух словах выглядит так, как показано ниже:

 <?php

//=== somesite.php ===//
[...]
$template = new siteMainTemplate("article.tpl");
$template->setCurrentBlock("ARTICLE");
$template->setVariable("ARTICLE_HEAD", "some headline");
$template->setVariable("ARTICLE_BODY", "some text");
[...]
$template->parseCurrentBlock();

$template->showSite();
[...]

?>
 

Определение класса, расширяющее пакет PEAR:

 <?php

//=== classdefs.php ===//
require_once "../PEAR/ITX.php";

class siteMainTemplate extends HTML_Template_ITX {

  function __construct($pageBody, $pageTitle) {

    $this->template = $this->HTML_Template_ITX("../templates/");
    [...]

  }  // ... end of function

  function showSite() {
    $this->show();
  }  // ... end of function

}  // ... end of class definition

?>
 

Это приводит к ошибке «Вызов неопределенного метода siteMainTemplate::HTML_Template_ITX ()».

Строка, выдающая ошибку, выглядит так

$this->template = $this->HTML_Template_ITX("../templates/");

и это выглядит странно с самого начала, но работает уже очень давно. Изменив его на что-то вроде

$this->template = new HTML_Template_ITX("../templates/");

приводит к пустой/пустой странице — ну, с включенными ошибками на самом деле происходит следующее:

 Warning: preg_match_all(): Empty regular expression in /.../PEAR/IT.php on line 1020
Warning: preg_match(): Empty regular expression in /.../PEAR/ITX.php on line 296
Notice: Undefined property: siteMainTemplate::$parseCurrentBlock in /.../classes/classdefs.php on line ...
 

Это явно указывает на неправильное определение класса прямо здесь.

Может кто-нибудь посоветовать, что я здесь делаю не так?

Изменить: Исправлена опечатка во втором фрагменте кода — вторая функция предназначена для завершения примера как «showSite()», а не как вторая функция конструктора.

Комментарии:

1. У вашего siteMainTemplate класса действительно есть две __construct функции или это опечатка?

2. Да, опечатка. Извините за это — отредактировал исходный пост. Спасибо, что дали мне знать.

Ответ №1:

Еще несколько тестов показали, что правильная линия действительно:

 $this->template = new HTML_Template_ITX("../templates/");
 

После этого предупреждения, размещенные в вопросе, просто скрывали дальнейшие несоответствия, связанные с обработкой переданного «каталога шаблонов».