这更多的是一个"如何应该我?" 而不是"如何做我?" 题.
通常,什么被认为是将变量传递给包含文件的最佳方法?
例如,假设我正在使用一个菜单片段,并希望其中一个菜单项(当前的一个)具有某个类名(这是一个非常通用的样本 - 不是我实际使用的):
<?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语句相应地重构所有包含文件).
我喜欢为此使用一个对象,如这篇 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 几乎是新手,欢迎批评。
| 归档时间: |
|
| 查看次数: |
5062 次 |
| 最近记录: |