代码块之间的 PHP 变量作用域

php
2022-08-30 19:44:01

我是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


答案 1

你在php代码块中赋予了太多意义。
这不是那么全球化的东西。
这些块属于同一个 PHP 脚本。这只是一种输出HTML的简洁方式,仅此而已。你可以用回显HTML来代替它,并且不会有丝毫的区别。

整个PHP脚本是一次执行的,而不是迭代,正如你可能想象的那样,认为PHP块在服务器端执行,然后HTML块在客户端执行,然后回到服务器端的PHP块,依此类推。这是错误的。
整个PHP脚本在服务器端执行,在浏览器中产生纯HTML,然后死亡。

这就是为什么你不能在同一个PHP脚本中同时对HTML表单及其处理程序进行编程,只是将后者放在前者之后。您必须对服务器进行另一次调用才能使处理程序正常工作。这将是另一个完全的调用,同一脚本的另一个实例,对早已死亡的上一个调用一无所知。这是你必须知道的关于PHP的另一件事:

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

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

答案 2

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


关于这一点的有趣的手册页是这个: 变量范围 ;引用

在大多数情况下,所有 PHP 变量只有一个作用域。
此单一作用域还涵盖包含的文件和必需的文件。

如果作用域跨度到其他文件(但不是这些文件中的函数!),则它可能也跨越到同一文件中的不同php块;-)


基本上,你有:

  • 一个全局作用域:在所有函数之外(以及声明为全局的变量,内部函数)
  • 每个函数一个作用域。

你处于第一种情况,通过你的例子。


推荐