這是更多'如何應該我?而不是'做什麼我?題。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
聲明)。
感謝您的回覆rfw,但正如我所提到的,這似乎是不好的做法,因爲這些變量名稱將是全球性的。另外,如果使用絕對路徑,可以使用查詢字符串(參見示例3,http://php.net/manual/en/function.include.php),但由於上面列出的原因,我不認爲這是最好的一般方法要麼(因爲你會丟失原來的$ _GET變量) – momo 2011-02-09 00:35:57
@Big MoMo也許你會希望我的函數方法更好? – rfw 2011-02-09 00:37:28