PHP – лучшая практика для передачи переменных для включения файлов

Это больше похоже на «Как мне?» а не «Как я?» вопрос.

Как правило, что считается лучшим способом передать переменные во включенный файл?

Например, предположим, что я использую фрагмент для меню и хочу, чтобы один из пунктов меню (текущий) имел определенное имя класса (это очень общий образец – не то, что я фактически использую):

<?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 ).

Solutions Collecting From Web of "PHP – лучшая практика для передачи переменных для включения файлов"

Мне нравится объект для этого, как описано в этой статье стека 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