这更像是一个“如何应该我?”而不是'如何做我?问题
通常,什么被认为是将变量传递给包含文件的最佳方法?
例如,假设我正在使用片段作为菜单,并希望其中一个菜单项(当前菜单项)具有某个类名(这是一个非常通用的样本 - 而不是我实际上使用):
<?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'
)附加变量,但这似乎是一个坏主意,因为你可能需要任何给定的{真实'$_GET
{ {1}}。
或 - 您可以使用include
启动每个包含的文件并返回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
语句相应地重构所有包含文件。
答案 0 :(得分: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" );
}
}
在view方法中定义$ active_link包含方法中$ active_link的变量范围。然后调用此代码:
$aViewMenu = new viewMenu( $active_link );
$aViewMenu->view();
但是,我几乎不熟悉PHP中的MVC,我欢迎责备。
答案 1 :(得分: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