有关PHP范围的问题 - 来自Java程序员的观点

时间:2011-01-16 22:25:00

标签: php session scope request

我还不熟悉PHP,所以我试图理解PHP Web应用程序中的范围概念。

在Java世界中,Java Web应用程序 - 使用Java Server Pages(JSP)和向上 - 将允许Java Bean具有以下级别的范围:

  • 请求
  • 会话
  • 应用

尝试将这些映射到PHP的范围界定功能:

  • 页面:不是真的,但是在调用函数之后,调用本地的对象被视为“已消失”,因此它有点像页面范围
  • 请求:使用“$ _REQUEST super global(不知道这是哪里...... Cookies?隐藏字段?URL参数?)
  • 会话:使用PHP的$ _SESSION超级全局(其中一些文档和论坛反馈表明,出于安全原因,这不是放置敏感信息的好地方)。
  • 应用程序:使用PHP的APC(Stack Overflow链接)

我是完全出去吃午餐还是这些相似的?我知道一个主要的区别是PHP的[“Shared Nothing”] [5]架构与允许共享的Java相比。

欢迎任何建议/指导/清醒的修正。

2 个答案:

答案 0 :(得分:5)

你走在正确的轨道上。 PHP确实是Share-Nothing。

在Web上下文中,php应用程序完整地为每个HTTP请求运行一次。这意味着解释器读取,解析和执行脚本的每个HTTP请求(这是简化的 - 使用像APC这样的操作码缓存消除了读取/解析开销)。

PHP以superglobals的形式将输入提供给脚本,例如$ _REQUEST和$ _SESSION。 Superglobals与常规全局变量的不同之处在于它们在每个范围内都可自动使用,因此无需使用global关键字。

请求之间存在的任何数据都需要存储在外部。要跨用于维护用户状态的请求共享数据,通常使用$ _SESSION,默认情况下将其序列化并写入磁盘上的文件(但可以配置为使用内存缓存或数据库)。要在会话之间共享的数据(我认为它类似于JSP世界中的应用程序范围)需要在外部某处隐藏。您可以使用内存缓存(如APC或内存缓存),或将平面文件写入磁盘,或将内容粘贴到数据库中,或使用您可以提出的任何其他方案。在一天结束时,没有任何内置的东西。

除了超全球外,变量范围相当无聊。默认情况下,变量位于创建它们的范围内。

要在非全局范围内引用全局变量(即:在函数内部),您需要使用global关键字将符号导入本地范围。 PHP以这种方式工作,使得更难以意外地破坏全局变量。

这些内容以及更多内容涵盖了well in the manual

答案 1 :(得分:1)

你应该看看这个:

http://php.net/manual/en/language.variables.scope.php

你有本地和全球范围,超全局,静态变量。那个页面解释了每个人的工作方式。