我正在尝试重构一些代码,并且有些模板使用全局变量。函数内部的require
和include
仅使用局部范围,那么是否有“需要全局”的方法?
现在,我们在所有路由器文件中都有相当多的代码重复。此问题涉及的陈述:
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>
这是一个简化的例子,在实际的模板中可能会有很多全局变量。
我应该如何将输出代码移动到方法?
答案 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);