代码块之间的PHP变量范围

Cap*_*mic 19 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>");
?>
Run Code Online (Sandbox Code Playgroud)

我宁愿一次检索$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; ?>
Run Code Online (Sandbox Code Playgroud)

但我怀疑$user_info无法在块之间共享,因为它不是全局的.通常的做法是什么?

You*_*nse 34

你在php代码块中添加了太多意思.
这不是全球性的.
这些块属于同一个PHP脚本.它只是输出HTML的一种简洁方式,仅此而已.您可以用回显HTML替换它,并且没有丝毫差异.

整个PHP脚本一次执行,而不是迭代,因为您可能想到这一点,认为PHP块正在服务器端执行,然后HTML阻塞客户端,然后回到服务器端的PHP块,所以上.那是错的.
整个PHP脚本正在服务器端执行,在浏览器中生成纯HTML.

这就是为什么你不能在同一个PHP脚本中编写HTML表单及其处理程序的原因,只需在第一个脚本之后放置后者即可.您将不得不再次调用服务器以使处理程序工作.完全是另一个调用,同一个脚本的另一个实例,而前一个已经很久了 - 这是你必须了解的关于PHP的另一件事:

PHP脚本执行是原子的.它不像是在浏览器中不断运行的桌面应用程序,甚至不是与桌面应用程序持久连接的守护程序.它更像是一个命令行实用程序 - 完成它的工作并退出.它是独立运行的:

  1. 浏览器拨打电话
  2. PHP醒来,创建一个HTML页面,将其发送到浏览器并死掉
  3. 浏览器呈现HTML并将其显示给用户.
  4. 用户单击链接
  5. 浏览器拨打电话
  6. 另一个PHP实例,对前一个调用一无所知,唤醒等等


Sar*_*raz 6

您可以在块(循环,if语句)中使用它,但不能在函数内使用它.要使其在函数内部工作,您必须使用以下global关键字:

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

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

   // more code
}
Run Code Online (Sandbox Code Playgroud)

您可以在官方文档上阅读有关PHP变量范围的更多信息:)


Pas*_*TIN 6

即使$user_info没有声明global,也可以在几个PHP块中使用:你发布的内容应该有用;-)


有趣的手册页就是这个:变量范围 ; 引用:

在大多数情况下,所有PHP变量只有一个范围.
此单一范围也涵盖包含和所需文件.

如果范围跨越其他文件(但不是那些文件中的函数!),它也可能跨越同一文件中的不同php块;-)


基本上,你有:

  • 一个全局范围:在所有函数之外(以及声明为全局,内部函数的变量)
  • 每个功能一个范围.

你是第一种情况,你的例子.

  • @Captain:"有人"?您的脚本由一个PHP进程执行,您没有两个人同时在同一内存中执行相同的PHP.如果两个人同时执行脚本,第一次执行的变量将在一个内存块中,第二次执行的变量在第二个不同的内存块中=>可能没有多线程问题(PHP没有反正使用线程 (2认同)