我对 PHP 还很陌生,所以我试图理解 PHP Web 应用程序中的范围概念。
在 Java 世界中,Java Web 应用程序(使用 Java Server Pages (JSP) 及以上)将允许 Java Bean 具有以下级别的范围:
尝试将这些映射到 PHP 的作用域功能:
- 页面:不是真的,但是调用本地的对象在函数调用后被认为“消失”,所以它有点像页面范围
- 请求:使用“$_REQUEST 超级全局”发出(不确定它去哪里...Cookie?隐藏字段?URL 参数?)
- 会话:使用 PHP 的 $_SESSION 超级全局(其中一些文档和论坛反馈表明,出于安全原因,这不是放置敏感信息的好地方)
- 应用程序:使用 PHP 的 APC(Stack Overflow 链接)
我是完全出去吃午饭还是这些相当相似?我知道 PHP 的 [“Shared Nothing”][5] 架构与 Java 的架构之间的一个主要区别是允许共享。
欢迎任何建议/指导/发人深省的更正。
你走在正确的轨道上。 PHP 确实是不共享的。
在 Web 上下文中,PHP 应用程序针对每个 HTTP 请求完整运行一次。这意味着对于每个 HTTP 请求,解释器都会读取、解析并执行脚本(这是简化的 - 使用像 APC 这样的操作码缓存可以消除读取/解析开销)。
PHP 以以下形式将输入提供给脚本超全局变量 http://php.net/manual/en/language.variables.superglobals.php,例如 $_REQUEST 和 $_SESSION。超全局变量与常规全局变量不同,它们在每个作用域中自动可用,因此无需使用global
关键词。
请求之间持续存在的任何数据都需要存储在外部。要跨请求共享数据以维护用户的状态,通常使用 $_SESSION,它默认被序列化并写入磁盘上的文件(但可以配置为使用内存缓存或数据库)。要在会话之间共享的数据(我认为这类似于 JSP 世界中的应用程序范围)需要存储在外部的某个地方。您可以使用 APC 或 memcache 等内存缓存,或者将平面文件写入磁盘,或者将内容保存在数据库中,或者使用您能想到的任何其他方案。归根结底,没有任何内置的东西。
除了超全局变量之外,变量作用域相当无聊。默认情况下,变量存在于创建它们的范围内。
要在非全局作用域(即:函数内部)引用全局变量,您需要使用以下命令将符号导入到局部作用域中:global
关键词。 PHP 以这种方式工作可以使全局变量更难被意外破坏。
这些东西,还有更多,都被覆盖得很漂亮手册上写得很好 https://www.php.net/manual/en/language.variables.scope.php.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)