Это больше похоже на «Как мне?» а не «Как я?» вопрос.
Как правило, что считается лучшим способом передать переменные во включенный файл?
Например, предположим, что я использую фрагмент для меню и хочу, чтобы один из пунктов меню (текущий) имел определенное имя класса (это очень общий образец – не то, что я фактически использую):
<?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». очевидно, что он ищет переменную (int), называемую $active_index
чтобы определить, к какой ссылке относится класс .active.
так что – вы могли бы просто определить $active_index
перед вызовом include, но это кажется плохой практикой для меня, поскольку, возможно, переменная этого имени могла быть определена для чего-то еще раньше, и более поздняя часть скрипта все еще ищет его.
или – вы можете использовать абсолютный путь и добавлять переменные с помощью querystring ( 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))?>
но опять-таки это, кажется, имеет несколько недостатков (необходимо реструктурировать все ваши включенные файлы соответственно с 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" ); } }
Определение $ active_link внутри метода представления содержит область переменной $ active_link внутри метода. Затем назовите этот код:
$aViewMenu = new viewMenu( $active_link ); $aViewMenu->view();
Тем не менее, я почти новичок в MVC на PHP, и я приветствую упрек.
Лично я бы просто определил $active_index
перед $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