代码块之间的PHP变量范围

时间:2011-02-26 10:08:52

标签: 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,因为它不是全局的。 通常的做法是什么?

3 个答案:

答案 0 :(得分:33)

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

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

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

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

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

答案 1 :(得分:6)

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

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

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

   // more code
}

You can read more about PHP variable scope on the official docs :)

答案 2 :(得分:6)

即使$user_info未声明为global,也可以在多个PHP块中使用:您发布的内容应该有效; - )


有趣的手册页就是这个:Variable scope; 引用

  

大部分都是PHP变量   只有一个范围。
这   单范围跨度包括和   所需的文件。

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


基本上,你有:

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

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