2014-06-23 70 views
1

我試圖重構一些代碼,並且存在使用全局變量的模板。 requireinclude裏面的一個函數只使用局部範圍,那麼有沒有辦法可以「需要全局」?PHP需要使用全局變量的模板

現在,我們在所有路由器文件中都有相當多的代碼行重複,像這樣。此問題涉及的陳述如下:

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

您可以嘗試使用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(); 
0

超全球變種已經可用。對於其他變量,它是一些額外的工作,但一個正常的做法是這樣的:

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); 
+0

這是不可行的全局變量的數量可以在運行時會有所不同。將使用'$ GLOBALS'工作(即'公共函數__construct(){$ this-> data = $ GLOBALS;}')? –

+0

這不是很安全,但是,看@ Christian的答案。 – AbraCadaver