【问题标题】:PHP vs ASP.NET static variablesPHP 与 ASP.NET 静态变量
【发布时间】:2025-12-02 15:15:01
【问题描述】:

ASP.NET 中的静态变量今天让我措手不及。然后我吓坏了,因为这意味着要么我对 Web 世界中的静态变量有根本性的误解,要么 ASP.NET 的行为不像我想象的那样。

所以在 ASP.NET 中

public class MyClass {
    public static bool myVar = true;    
}

如果 ASPUserA 设置 MyClass.myVar = false 系统上的每个其他用户都会经历这些变化。因此,ASPUserB 将有 myVar = false。我的来源:http://www.foliotek.com/devblog/avoid-static-variables-in-asp-net/

class MyClassPHP {
    public static $myVar = false;
}

如果 PHPUserA 设置了MyClass::$myVar = true,这是否意味着系统上的每个用户都会经历这些变化???

谢谢。


经过进一步研究,我这样做了;

class MyClassPHP {
    public static $myVar = 0;
}

然后我让访问页面的用户这样做

MyClassPHP::$myVar++;
echo MyClassPHP::$myVar;

始终是 1。无论我刷新多少次或同时连接多少次... WOHHH 这是一个很棒的结论,否则我就完蛋了!!


ASP.NET 更新

经过进一步研究和测试,我发现了这一点。

public partial class MyPage : System.Web.UI.Page
{
    public static int myInt = 0;

    protected void Page_PreInit(object sender, EventArgs e)
        myInt++;
    }

}

然后我的页面可以显示myInt

在浏览器(Firefox 和 chrome)之间,myInt 在我刷新页面时逐渐变高。因此,如果您的 classstatic,这并不重要。仅当您有静态变量时才重要。它们的应用范围很广。

【问题讨论】:

  • 哇! ASP.NET 真的做到了吗?那是愚蠢的=/
  • 我很困惑。它有点把我的范式吹出了窗外!
  • 感谢您说服我从不使用 ASP.NET ;-P
  • 如果 myVar 在每个请求中都发生变化,您能解释一下为什么这里的 myVar 是静态的吗?
  • @Baz1nga:因为在PHP中一旦请求完成,脚本就完成了,PHP就不再运行了。

标签: php asp.net static


【解决方案1】:

在 IIS 中运行时:

静态变量不是特定于“页面”的。它是“AppDomain”特定的。与“页面”的唯一关系是变量的路径(可以这么说)(例如 MyProject.MyPage.MyVariable)。因为您的应用程序的所有用户都在同一个 AppDomain(即同一个 IIS 应用程序文件夹)中运行,所以他们都将使用同一个静态变量。所以...最终您的用户将看到彼此的信息,因为他们都共享一个静态变量。

然而,PHP 会跟踪每个用户实例的静态数据,所以我猜你可以称它们为“远离单例危险区域更安全”。

【讨论】:

  • 我的意思是它不......可怕?在某些情况下,您必须绕过它,但在其他情况下,它在内存管理方面非常棒。然后,您可以让一个对象在一组用户中运行相同的功能,而不是让同一对象的 10 个副本执行相同的操作。我想这只是一个偏好问题:D
  • 这是旧的,但这不是偏好问题,一个页面被多个用户访问,所以,正常的行为是 PHP 的,而不是 ASP.Net ......这个不是一个单一用户的 Windows 窗体......它真的爆炸了你的范例,比如单例来管理数据库,但有不同的连接查询......一个用户进入一个页面,有 A 连接,更改到其他页面有 B 连接,但是新用户去 C,他看到 A 或 B 直到它被改变......真的很沮丧不能使用单例 PER USER......
【解决方案2】:

不,PHP 不像 ASP.NET 那样愚蠢(它真的会那么做吗?)。 PHP 中的静态变量是每个实例的(它不像 ASP.NET 那样整个页面都是一个实例,每个用户都有自己的 PHP 实例)。

如果 2 个用户访问一个 PHP 页面,并且在一个页面上运行 MyClass::$myVar = true,则不会影响另一个用户。

【讨论】:

  • 为什么这是愚蠢的?静态不是会话变量。从你所说的php页面上的静态连接到用户,那怎么可能?如果用户没有cookie?那么静电不连接,每次都有新的静电诞生?我认为 MS 做得很好,静态就是池的说法。
  • asp.net 用户会话变量按你说的做。另一方面,php如何在所有正在运行的实例中保留公共数据?例如,我使用静态声明一些不变的东西,并且在所有用户上都使用了很多,你如何在 php 上做到这一点?
  • @Aristos:“声明一些不变的东西,并且在所有用户上都使用了很多”你没有,或者你将它存储在数据库中。
  • @Aristos:“静态不是会话变量”是的。会话通过不同的请求存在,静态变量不存在。脚本完成后,PHP 退出,所有变量都被垃圾回收(cookie/session 除外)。
  • 所以我知道静态工作在 php 和 asp.net 上是一样的,不同的是 asp.net 保持运行请求的池 VS 不是保持运行,而是启动它并根据请求结束。