PHP - 传递变量以包含文件的最佳实践

时间:2011-02-09 00:26:39

标签: php include

这更像是一个“如何应该我?”而不是'如何我?问题

通常,什么被认为是将变量传递给包含文件的最佳方法?

例如,假设我正在使用片段作为菜单,并希望其中一个菜单项(当前菜单项)具有某个类名(这是一个非常通用的样本 - 而不是我实际上使用):

<?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语句相应地重构所有包含文件。

2 个答案:

答案 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