PHP需要使用全局变量的模板

时间:2014-06-23 20:32:13

标签: php scope require

我正在尝试重构一些代码,并且有些模板使用全局变量。函数内部的requireinclude仅使用局部范围,那么是否有“需要全局”的方法?

现在,我们在所有路由器文件中都有相当多的代码重复。此问题涉及的陈述:

require 'header.php';
require $template;
require 'footer.php';

这些陈述可在全球范围内找到。我正在尝试将这些重构为类中的方法:

class Foo {

    /**
     * Template file path
     * @var string
     */
    protected $template;

    public function outputHTMLTemplate() {
        header("Content-Type: text/html; charset=utf-8");
        require 'header.php';
        if (file_exists($this->template)) {
            require $this->template;
        }
        require 'footer.php';
    }

}

假设我有template.php,在模板中有超全局和全局变量,如下所示:

<h1>Hello <?= $_SESSION['username']; ?></h1>
<ul>
<?php
foreach ($globalVariable1 as $item) {
    echo "<li>$item</li>";
}
?>
</ul>

这是一个简化的例子,在实际的模板中可能会有很多全局变量。

我应该如何将输出代码移动到方法?

2 个答案:

答案 0 :(得分:0)

您可以尝试使用extract php函数。它将使所有全局变量可用于包含的文件,就像它包含在全局范围中一样。

<?php

$myGlobal = "test";

class Foo {

    /**
     * Template file path
     * @var string
     */
    protected $template;

    public function outputHTMLTemplate() {
         extract($GLOBALS);

         header("Content-Type: text/html; charset=utf-8");
         require 'header.php';
         if (file_exists($this->template)) {
             echo $myGlobal; // Prints "test"
             require $this->template;
         }
         require 'footer.php';
    }

}

$x = new Foo();
$x->outputHTMLTemplate();

答案 1 :(得分:0)

Superglobals已经上市。对于其他变量,这是一项额外的工作,但正常的方法是:

protected $data;
protected $template;

public function outputHTMLTemplate() {
     header("Content-Type: text/html; charset=utf-8");
     require 'header.php';
     if (file_exists($this->template)) {
         extract($this->data);
         require $this->template;
     }
     require 'footer.php';
}

public function setData($var, $val) {
    $this->data[$var] = $val;
}

$foo->setData('globalVariable1', $globalVariable1);