Передача параметров в php включает/требует конструкцию

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

Я хочу создать механизм для проверки того, имеет ли зарегистрированный пользователь, доступ к PHP скрипт, который в настоящее время называется. Если это так, script будет продолжен; если нет, script просто не работает, используя что-то вроде die('you have no access').

Я придумал два способа сделать это:

(пожалуйста, предположите, что мой сеансовый материал закодирован/работает нормально - то есть я вызываю session_start(), правильно настроил сеансовые вары и т.д.)

  • Сначала определите глобальную переменную, затем проверьте глобальную переменную в требуемом файле заголовка. Например:

    Содержимое current_executing_script.php:

    // the role the logged in user must have to continue on   
    $roleNeedToAccessThisFile = 'r';
    require 'checkRole.php''
    

    Содержимое checkRole.php:

    if ($_SESSION['user_role'] != $roleNeedToAccessThisFile) die('no access for you');
    
  • Определите функцию в файле заголовка и вызовите функцию сразу после включения/необходимости:

    Содержимое checkRole.php:

    function checkRole($roleTheUserNeedsToAccessTheFile) {
        return ($_SESSION['user_role'] == $roleTheUserNeedsToAccessTheFile);
    }

    Содержимое current_executing_script.php:

    require 'checkRole.php';
    checkRole('r') or die('no access for you');

Мне интересно, есть ли способ просто передать параметр checkRole.php как часть конструкции include или require?

Спасибо заранее.

Ответы

Ответ 1

Невозможно передать параметры, которые нужно включить или потребовать.

Однако включенный код присоединяется к потоку программы в том месте, где вы его включаете, поэтому он наследует любые переменные, которые находятся в области видимости. Так, например, если вы установите $myflag = true непосредственно перед включением, ваш включенный код сможет проверить, для чего установлен $myflag.

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

Надеюсь, что это поможет.

Ответ 2

Включить с параметрами

Это то, что я использовал в своем недавнем проекте Wordpress

Сделайте функцию functions.php:

function get_template_partial($name, $parameters) {
   // Path to templates
   $_dir = get_template_directory() . '/partials/';
   // Unless you like writing file extensions
   include( $_dir . $name . '.php' );
} 

Получить параметры в cards-block.php:

// $parameters is within the function scope
$args = array(
    'post_type' => $parameters['query'],
    'posts_per_page' => 4
);

Вызвать шаблон index.php:

get_template_partial('cards-block', array(
    'query' => 'tf_events'
)); 

Если вы хотите обратный вызов

Например, общее количество отображаемых сообщений:

Измените functions.php на это:

function get_template_partial($name, $parameters) {
   // Path to templates
   $_dir = get_template_directory() . '/partials/';
   // Unless you like writing file extensions
   include( $_dir . $name . '.php' );
   return $callback; 
} 

Измените cards-block.php на следующее:

// $parameters is within the function scope
$args = array(
    'post_type' => $parameters['query'],
    'posts_per_page' => 4
);
$callback = array(
    'count' => 3 // Example
);

Измените index.php на это:

$cardsBlock = get_template_partial('cards-block', array(
    'query' => 'tf_events'
)); 

echo 'Count: ' . $cardsBlock['count'];

Ответ 3

В прошлом многие люди не соглашались с этим подходом. Но я думаю, что это вопрос мнения.

Вы не можете передать параметр _GET или _POST с помощью функции require() или include(), но вы можете сначала установить ключ/значение _SESSION и потянуть его с другой стороны.