PHP 与 ASP.NET 静态变量



ASP.NET 中的静态变量今天让我措手不及。 然后我吓坏了,因为这意味着要么我对网络世界中的静态变量有根本性的误解,要么 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。 无论我刷新多少次或同时连接多少次......呵呵,这是一个很好的结论,否则我就完蛋了!!


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逐渐升高。 因此,如果您的class static,这并不重要。 只有当你有静态变量时,它才重要。 它们是应用程序范围的。

在 IIS 中运行时:

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

然而,PHP 跟踪每个用户实例的静态数据,所以我想你可以称它们为"从单例危险区更安全"。

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

如果 2 个用户转到一个 PHP 页面,并在一个页面上运行MyClass::$myVar = true,则不会影响其他用户。

最新更新