PHP 作用域、$GLOBALS 和单例

标签 php scope global-variables

我很难回答一些非常基本的 PHP 问题。我看过的视频教程都是使用 PHP 的服务器端脚本的基础知识,但很少真正解释 PHP 的工作原理。

假设我们有 2 个用户同时从世界不同地区连接到同一个 LAMP 服务器,并且都在请求 Widget.php。

(a) Apache/PHP 如何有效地“复制 2 个实例”Widget.php 脚本及其依赖项,以便分别处理 2 个 HTTP 请求?

(b) 从上面的 (a) 部分开始,PHP 如何划分用户请求以将它们分开?如果 Widget.php 使用名为 $_SESSION['cheese'] 的 session 变量,PHP 如何为两个用户保持 cheese 的值分开?

(c) PHP $GLOBALS 是用户范围的还是应用程序范围的?意思是,对于全局变量 $GLOBALS['bread'],用户 1 和 2 是否都共享对它的相同引用,或者 PHP 是否像上面在 (b) 中对 session 变量所做的那样将它们分开)?

(d) PHP $GLOBALS 变量和实现单例设计的对象有什么区别?如果应用程序只能访问单例的 1 个实例,那么它不是全局的吗?是否应该考虑性能因素?

最佳答案

将 php 应用程序视为每次服务器请求它时执行的脚本,而不是作为存在于服务器内存中的应用程序。当 HTTP 请求进入脚本时,$_SESSION['cheese'] 对于请求它的用户来说是唯一的,因为 session ID 存储在客户端的浏览器 cookie 中。

全局变量只是具有脚本范围的变量,因此对于发送 HTTP 请求脚本范围的用户来说是相同的。单例是一个只能有一个实例的类,与全局的不同。

PHP 脚本是无状态的,因为当脚本完成执行时,对象持有的所有值都将丢失。使对象在执行之间持久存在的唯一方法是序列化到数据库或 session 或文件系统。

关于PHP 作用域、$GLOBALS 和单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5704227/

相关文章:

php - 如何对小数进行四舍五入?

php - MySQL表中的日期格式

c++ - 在使用 GLUT 时避免使用全局变量

actionscript-3 - AS3 需要范围指导吗?

c++ - 静态(全局)对象的初始化是如何发生的

javascript - Node.js:在模块范围内使用时, `this` 运算符的上下文是什么?

php - Laravel 5.2 验证 : date_format:Y. m.d 不工作

php - 在这种情况下哪个最好,Base64 还是静态图像?

javascript - 各种自定义变量名称(例如 createComment)会在内联 javascript 中被覆盖,但不会在外部 js 中被覆盖。为什么?

linux - cmake execute_process 找不到源命令