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
,则不会影响其他用户。