【问题标题】:Template class stops another class from working模板类阻止另一个类工作
【发布时间】:2023-04-06 18:37:01
【问题描述】:

试图让一个简单的模板系统工作,但它似乎影响了另一个类。

我有两个 PHP 类,都在 index.php 中调用:

  • HeaderData.php - 类允许用户设置 Header 数据,例如 doctype, 字符集。
  • PageTemplates.php - 类允许用户包含模板文件。

当我调用 HeaderData 类时,手动 require() 视图中的模板文件(即包含 doctype、head、meta 标签等),来自 header 类的代码在模板中工作正常文件,从头类输出对象,如Doctype等。

但是,当我尝试使用 PagesTemplate 类来包含模板文件时(从 index.php 中删除了手动 require()),模板文件被包含在内,但 HeaderData 类不再在其中工作。
错误日志显示:

  • 注意:“未定义变量 varHeaderData”;
  • 错误:“在非对象上调用成员函数 PageDoctype()”;

手动require() index.php 中的模板文件时,变量和函数都可以正常工作。

以下代码仅供开发人员使用(待添加数据检查等):

index.php:

// Use HeaderData Class
$varHeaderData = new HeaderData( 
                            array(  
                                   'PageDoctype' => '<!DOCTYPE html>',
                                   'PageCharset' => 'UTF-8', 
                                  ));

// Use PageTemplates Class
$varPageTemplate = new PageTemplates();
$varPageTemplate->LoadTemplate('template-file.php');

PageTemplates.php 类:

class PageTemplates
  {

    private $strTemplatesDir = 'view/templates/';

    public function __construct($strTemplatesDir = NULL)
      {
        if ( is_dir($strTemplatesDir) )
          {
            $this->strTemplatesDir = $strTemplatesDir;
          }
      }


    public function LoadTemplate($strTemplateFile)
      {
         {
           require_once ($this->strTemplatesDir.$strTemplateFile);
         }
      }

  }

模板文件.php:

echo $varHeaderData->PageDoctype();  

HeaderData 类只是使用类中的PageDoctype() 函数设置用户在数组中输入的对象(同样,这在没有页面模板类的情况下也可以正常工作)

谁能告诉我为什么当使用模板类require() 模板文件时,它会阻止来自 HeaderData 的对象在 template-file.php 中工作?

【问题讨论】:

  • 当您在LoadTemplate 方法中需要一个文件时,它不会看到$varHeaderData,因为它在不同的范围内。
  • @barell 我尝试了在模板类中使用ob_start()/flush() 等的各种方法,然后在index.php 中围绕对象调用。我尝试的一切都阻止了 HeaderData 类在模板文件中的工作。那么我该如何解决这个范围问题呢?

标签: php class templates


【解决方案1】:

最简单的方法是将变量作为数组传递给LoadTemplate方法并使用extract函数:

public function LoadTemplate($strTemplateFile, $vars = array())
{
    extract($vars);
    require($this->strTemplatesDir.$strTemplateFile);
}

并且在 index.php 中

...
$varPageTemplate->LoadTemplate('template-file.php', array(
    'varHeaderData' => $varHeaderData
));

您的错误之一是:“在非对象上调用成员函数 PageDoctype()”,因此请确保在 HeaderData 类中定义了 PageDoctype() 方法。

【讨论】:

  • 感谢您的回答。我必须将来自其他类的各种变量传递给我以这种方式加载的每个模板。这不会破坏多态性,类的大部分美吗?
  • 另一种解决方案是使用global 关键字。我给出的答案甚至用于最流行的框架之一——Yii。当然那里更复杂,但想法是一样的。不知道怎么会和多态性冲突。
  • 我的意思是,HeaderData 类为 Meta 等设置了大约 8 种不同的东西,然后其他类(也在模板中使用)设置了各种数据。无论如何,感谢您的回答。我会有一个修补程序,并可能阅读另一个框架的方法(想避免这种情况,所以我的没有被污染,我的设置是小型的,并且故意不具有可扩展性)。再次感谢。
  • 如果您使用HeaderData 类只是为了保留您的元标记和/或在模板文件(或任何地方)中更新它,也许更好的解决方案是将HeaderData 设置为单例。
  • 感谢您的额外想法。我不知道单例如何改变范围,但会调查它。塔
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多