Подтвердить что ты не робот

Область переменных PHP между блоками кода

Я новичок в PHP (по-прежнему) и продолжаю учиться.

Мне часто приходится извлекать определенную переменную и получать доступ к ее свойствам.

<?php
      $id = $_REQUEST['id'];
      $user_info = get_userdata($id);

      echo('Username: '        . $user_info->user_login . "<br>");
      echo('User level: '      . $user_info->user_level . "<br>");
      echo('User ID: '         . $user_info->ID . "<br>");
      echo('First Name: '      . $user_info->user_firstname . "<br>");
      echo('Family Name: '     . $user_info->user_lastname . "<br>");
      echo('user_registered: ' . $user_info->user_registered . "<br>");
?>

Я бы предпочел однажды восстановить $user_info = get_userdata($id);, а затем использовать его, когда это необходимо в том же файле, но в разных <?php?> блоках

<?php
    $id = $_REQUEST['id'];
    $user_info = get_userdata($id);
?>

<some HTML>

<?php echo $user_info->user_login; ?>

<some HTML>

<?php echo $user_info->user_login; ?>

Но я подозреваю, что $user_info не может быть разделен между блоками, потому что он не является глобальным. Для чего это обычная практика?

4b9b3361

Ответ 1

Вы вкладываете слишком много значения в блоки кода php.
Это не что-то глобальное.
Эти блоки принадлежат одному и тому же сценарию PHP. Это просто аккуратный способ вывода HTML, не более того. Вы можете заменить его повторением HTML, и не будет никакой разницы.

Весь сценарий PHP выполняется сразу, а не итерациями, как вы, вероятно, представляете, думая, что блоки PHP выполняются на стороне сервера, затем блоки HTML на стороне клиента, а затем возвращаются к блокам PHP на стороне сервера и т.д. на. Это неправильно.
Весь сценарий PHP выполняется на стороне сервера, в результате в браузере появляется чистый HTML, а затем он умирает.

Вот почему вы не можете запрограммировать как HTML-форму, так и ее обработчик в одном и том же PHP-скрипте, просто поместив последнюю сразу после первой. Вы должны сделать еще один вызов на сервер, чтобы заставить обработчик работать. Это будет совершенно другой вызов, другой экземпляр того же сценария, ничего не знающий о предыдущем вызове, который уже давно мертв. И еще одна вещь, которую вы должны знать о PHP:

Выполнение PHP-сценария является атомарным. Это не похоже на настольное приложение, постоянно работающее в вашем браузере, или даже на демона с постоянным подключением к вашему настольному приложению. Это больше похоже на утилиту командной строки - делает свою работу и выходит. Это работает дискретно:

  1. браузер звонит
  2. PHP просыпается, создает HTML-страницу, отправляет ее в браузер и умирает
  3. Браузер отображает этот HTML-код и показывает его пользователю.
  4. Пользователь нажимает на ссылку
  5. браузер звонит
  6. другой экземпляр PHP, ничего не зная о предыдущем вызове, просыпается и так далее

Ответ 2

Вы можете использовать его в блоках (петли, если инструкции), но вы не можете использовать его внутри функций. Чтобы он работал внутри функций, вам нужно использовать ключевое слово global:

$user_info ....... //declared outside

function foo(){
   global $user_info // now available here too

   // more code
}

Вы можете узнать больше о области переменных PHP в официальных документах:)

Ответ 3

Даже если $user_info не объявлен как global, его можно использовать в нескольких PHP-блоках: то, что вы опубликовали, должно работать; -)


Интересная справочная страница об этом: Переменная область; цитирование:

По большей части все переменные PHP имеют только одну область. Знакомства единичные охват охвата включены и требуемые файлы.

Если область охватывает другие файлы (но не функции в этих файлах!), она, вероятно, распространяется на отдельные php-блоки в том же файле; -)


В принципе, у вас есть:

  • Одна глобальная область: вне всех функций (и переменных, объявленных как глобальные, внутренние функции)
  • Один объект для каждой функции.

Вы находитесь в первой ситуации с вашими примерами.