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

mom*_*omo 6 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>
Run Code Online (Sandbox Code Playgroud)

我会打电话给上面的'menu.inc.php'.很明显,它正在寻找一个变量(int)来调用$active_index哪个链接来赋予'.active'类.

所以 - 你可以$active_index在调用include之前定义,但这对我来说似乎是不好的做法,因为这个名称的变量可能已经为之前的其他东西定义了,并且脚本的后续部分仍然在寻找它.

或者 - 您可以使用绝对路径并使用查询字符串(include 'menu.inc.php?active_index=1')附加变量,但这似乎是一个坏主意,因为您可能需要$_GET任何给定的"真实" 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))?>
Run Code Online (Sandbox Code Playgroud)

但同样这似乎有一些缺点(必须使用ob函数和return语句相应地重构所有包含文件).

jpw*_*wco 4

我喜欢为此使用一个对象,如这篇 MVC 堆栈帖子中所述。在名为 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" );
    }
  }
Run Code Online (Sandbox Code Playgroud)

在视图方法内定义 $active_link 包含方法内 $active_link 的变量范围。然后调用这段代码:

$aViewMenu = new viewMenu( $active_link );
$aViewMenu->view();
Run Code Online (Sandbox Code Playgroud)

然而,我对 PHP 中的 MVC 几乎是新手,欢迎批评。