【问题标题】:PHP template inclusion outside global scopePHP 模板包含在全局范围之外
【发布时间】:2016-02-22 16:00:23
【问题描述】:

我目前正在创建一个框架,只是为了个人学习项目,即能够在未来总体上评估 php-frameworks。随着我开始对某些框架建立更多的认识,特别是关于他们设计模块并使其在“范围”内可用的方式,在这个项目的开发过程中,我也很困惑为什么几乎所有框架开发者将(视图)模板包含在其类的范围内。

也许有一些开发人员在这些板上漫游,他们能够对此提出建设性意见。

一个例子(为了清楚起见,它被过度简化了)。

为什么要这样做……

<?php

class TemplateInc {

    public $template;

    public function __construct($page) {

        $this->template = $page;
    }

    public function render() {

        require_once $this->template;
    }
}

$template_include = new TemplateInc('mypage.html');
$template_include->render();

?>

...什么时候也可以这样做,同时还可以在模板中使用全局范围的变量(如果合适的话)?

<?php

class TemplateName {

    public $template;

    public function __construct($page) {

        $this->template = $page;
    }

    public function getTemplate() {

        return $this->template;
    }
}

$templatename = new TemplateName('mypage.html');
require_once $templatename->getTemplate();

?>

【问题讨论】:

    标签: php frameworks


    【解决方案1】:

    通常模板类也会为模板提供额外的值。例如:

    public function render(array $vars) {
        extract($vars);
        require $this->template;
    }
    

    或者模板可以使用$this-&gt;.. 来访问属于该类的其他方法/对象/值/服务。如果您在课堂外执行require,这一切都不可能。然后只有 全局变量可用于模板,而您希望没有任何全局变量(不要使用global)。在方法中执行所有这些操作可以让您执行 extract($vars) 之类的操作,而不会弄乱全局范围。

    此外,您现在需要调用require $template-&gt;render(),而不是对$template-&gt;render() 进行很好的独立调用,这样一开始就否定了编写类的意义;调用者仍在做所有的工作,而类本身基本上不(不能)做任何事情。

    【讨论】:

    • 我可能弄错了,但恕我直言,这完全取决于整体设计。而不是仅仅使用类来包含类中的模板并能够(仅仅)提供它的本地范围($this),人们仍然可以通过 $template->getvars() 做到这一点,但会也可以从全局范围内为其提供 vars。使用像这样的(视图)类的有用性和封装将/可能/应该保持不变,而模板也受益于全局范围。
    • 评论第 2 部分 - 可能的 MVC 或 MVP 设置中的所有其他内容可能或仍将具有相同的职责,因为请求的所有结果仍可能通过 $view->getResult() 在模板中结束,因此它将保持 MVC/MVP 原则。唯一不同的是包含的位置。它通过“挑战”模板需要包含在本地(类)范围内但通用脚本仍然符合 OOP 原则的一般想法来打破传统。
    • 基本上你是在告诉我你想使用全局作用域来......几乎所有东西。好吧,使用这种设计方法,根本就没有太多用处谈论 OOP。如果您的模板确实依赖$template-&gt; 来访问数据,那么您就会遇到与全局变量相关的所有问题。也就是说,您必须将您的模板对象命名为$template,并且永远不能重命名它,并且您不能同时拥有它的两个实例,因为只能有一个具有该名称的全局变量。这……太疯狂了,除了最微不足道的应用程序。
    • 是的,这很有意义,但对于我的特定设计,只需要一个实例,它以不特定的顺序表示所有模板文件,尽管涵盖了所有相同的请求。我的特殊设计并没有违反 OOP 规则,只是为了能够从全局范围加载一些(语言)变量而改变它们。虽然这很容易转化为不好的做法,即程序方法,但只要程序员有足够的纪律性,可以将对象用于其他一切。看看这个小实验的结果很有趣。
    • 几天前我不得不承认我的错误做法,将模板暴露在全局范围内违反了封装原则,所以我将其重构为完全封装($view- >渲染())。感谢您的意见/批评。问候
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 2014-12-24
    • 2021-05-03
    • 1970-01-01
    • 2011-01-17
    相关资源
    最近更新 更多