2011-02-09 112 views
5

這是更多'如何應該我?而不是'做什麼我?題。PHP - 將變量傳遞給包含文件的最佳做法

通常,什麼被認爲是將變量傳遞給包含文件的最佳方式?

例如,假設我正在使用片段作爲菜單,並且希望其中一個菜單項(當前人)具有某個類名(這是一個非常通用的示例 - 而不是我實際使用):

<?php 
$links = array(
    array('text' => 'home', 'href' => 'home.php'), 
    array('text' => 'about', 'href' => 'about.php'), 
    array('text' => 'contact', 'href' => 'contact.php') 
); 
?> 
<ul> 
<?php for($i = 0; $i < 3; $i++) : 
    $link = $links[$i]; 
    $is_active = ($i == $active_index); 
?> 
    <li><a <?=($is_active ? 'class="active"' : '')?> href="<?=$link['href']?>"><?=$link['text']?></a></li> 
<?php endfor; ?> 
</ul> 

我會打電話給上面的'menu.inc.php'。顯然它正在尋找一個名爲$active_index的變量(int)來確定給「.active」類的鏈接。

所以 - 你可以在調用include之前定義$active_index,但這對我來說好像很差,因爲這個名字的變量可能已經被定義爲其他的東西了,後面的腳本仍然在尋找它。

或 - 你可以使用絕對路徑,並追加使用查詢字符串(include 'menu.inc.php?active_index=1')變量,但同樣這似乎是一個糟糕的主意,因爲你可能需要的任何給定include中的「真實」 $_GET

或 - 你可以開始每個包含ob_start文件,並返回ob_end_clean(),然後用像這樣得到的回報:

function load_view($file, $variables){ 
    extract($variables); 
    return include($file); 
} 
// passed like 
<?=load_view('menu.inc.php', array('active_index' => 2))?> 

,但這又似乎有一些缺點(具有重組所有您的包含文件相應地帶有ob函數和return聲明)。

回答

4

我喜歡這個目的,如所描述in this MVC stack post。在一個名爲viewMenu.class.php文件,

class viewMenu 
    { 
    private $active_link; 

    public function __construct ($active_link) 
    { 
    $this->active_link = $active_link; 
    } 
    //If the constructor doesn't work for you, try a "set" method. 

    public function view() 
    { 
    $active_link = $this->active_link; 
    include_once ("menu.inc.php"); 
    } 
    } 

定義視圖方法在$ active_link包含$ active_link變量範圍的方法內。然後調用此代碼:

$aViewMenu = new viewMenu($active_link); 
$aViewMenu->view(); 

但是,我幾乎是PHP中的MVC的新手,我很歡迎責備。

1

就個人而言,我只是在包含之前定義了$active_index,或者可能與更好的編碼實踐更接近,使菜單生成功能具有參數$active_index

例如(原諒下面的混亂):

<?php // menu.php 
$links = array(
    array('text' => 'home', 'href' => 'home.php'), 
    array('text' => 'about', 'href' => 'about.php'), 
    array('text' => 'contact', 'href' => 'contact.php') 
); 

function generate_menu($active_index) 
{ 
?> 
    <ul> 
    <?php 
    $linkcount = count($links); 
    for($i = 0; $i < $linkcount; $i++) 
    { 
     $link = $links[$i]; 
     $is_active = ($i == $active_index); 
    ?> 
     <li><a <?=($is_active ? 'class="active"' : '')?> href="<?=$link['href']?>"><?=$link['text']?></a></li> 
    <?php 
    } 
    ?> 
    </ul> 
} 

和:

<?php // mypage.php 
generate_menu(0); 
?> 
blah blah content goes here 
+0

感謝您的回覆rfw,但正如我所提到的,這似乎是不好的做法,因爲這些變量名稱將是全球性的。另外,如果使用絕對路徑,可以使用查詢字符串(參見示例3,http://php.net/manual/en/function.include.php),但由於上面列出的原因,我不認爲這是最好的一般方法要麼(因爲你會丟失原來的$ _GET變量) – momo 2011-02-09 00:35:57

+0

@Big MoMo也許你會希望我的函數方法更好? – rfw 2011-02-09 00:37:28