#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/");
После этого предупреждения, размещенные в вопросе, просто скрывали дальнейшие несоответствия, связанные с обработкой переданного «каталога шаблонов».