Передача переменных одному и тому же включению, которое появляется несколько раз

#php

Вопрос:

Я пытаюсь передать переменные в include, который появляется на странице несколько раз. Хотя следующий пример может технически работать, я уверен, что есть гораздо лучший способ сделать это. Любая помощь будет признательна.

index.php

 <?php 
    $user_avatar         = "user-1-avatar.jpg";
    $user_username       = "username-1";
    $user_name           = "User 1";

    include '/_user-card.php';
?>

<?php 
    $user_avatar         = "user-2-avatar.jpg";
    $user_username       = "username-2";
    $user_name           = "User 2";

    include '/_user-card.php';
?>
 

_user-card.php

 <div class="user-card">
    <img src="<?php echo $user_avatar; ?>" alt="">
    <p class="user-card__username"><?php echo $user_username; ?></p>
    <p class="user-card__name"><?php echo $user_name; ?></p>
</div>
 

Комментарии:

1. Вы можете преобразовать include в функцию и просто вызывать ее несколько раз с различными параметрами.

2. Этот пример работает, но может создать проблемы с безопасностью, выводя переменные без очистки. Возможно, вам захочется заглянуть в библиотеки шаблонов PHP. Список из них можно найти здесь, например: dunebook.com/best-php-template-engine

Ответ №1:

Вы можете создавать данные, которые можно использовать снова и снова, используя следующую функцию.

 function get_user_card($params = array()){
   $output = '';
   extract($params);
   if( isset($user_avatar) amp;amp; isset($user_username) amp;amp; isset($user_name) ) {
      ob_start();
      ?>
<div class="user-card">
    <img src="<?php echo $user_avatar; ?>" alt="">
    <p class="user-card__username"><?php echo $user_username; ?></p>
    <p class="user-card__name"><?php echo $user_name; ?></p>
</div>
      <?php
      $output = ob_get_contents();
      ob_end_clean();
   }
   return $output;
}
 
 $user_1 = get_user_card(
  array(
    "user_avatar" => "user-1-avatar.jpg",
    "user_username" => "username-1",
    "user_name" => "User 1"
  )
);

echo $user_1;