PHP与ASP.NET静态变量的区别

7

ASP.NET中的静态变量

今天,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。无论我刷新多少次或同时连接……哇,这真是个伟大的结论,否则我就完了!


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,则这并不重要。 这仅与静态变量有关。 它们是应用程序范围内的。


2
哇!ASP.NET真的能做那个吗?太蠢了 =/ - gen_Eric
2
我被它搞得很困惑。它似乎把我的编程范式都打破了! - ThePrimeagen
2
谢谢你说服我永远不使用ASP.NET ;-P - gen_Eric
1
你能解释一下为什么我的变量在每个请求中都会改变,但它在这里是静态的吗? - Baz1nga
1
@Baz1nga 我更新了代码,向您展示了在ASP.NET中如何运行。 - ThePrimeagen
显示剩余3条评论
2个回答

7
在IIS中运行时: 静态变量不是“页面”特定的,而是“AppDomain”特定的。与“页面”相关的唯一关系是变量的路径(例如MyProject.MyPage.MyVariable)。因为应用程序的所有用户都在同一个AppDomain中运行(即相同的IIS应用程序文件夹),所以他们将全部使用同一个静态变量。所以...最终,您的用户将看到彼此的信息,因为他们都共享同一个静态变量。 然而,PHP跟踪每个用户实例的静态变量,因此我想你可以称它们为“更安全的单例危险区域”。

3
我的意思是它并不...太糟糕?在某些情况下,你需要克服一些困难,但在内存管理方面,它有时也非常出色。因此,你可以使用单个对象来处理一组用户的相同功能,而不是使用10个副本执行相同的任务。我想这只是个人偏好问题 :D - Brent Echols
这虽然是老话题,但这不是偏好的问题。一个页面被多个用户访问,所以正常的行为应该是PHP的,而不是ASP.Net的...这不是单用户的Windows表单...它真的会打破你的范式,比如使用singleton来管理数据库,但是有不同的连接查询...一个用户进入一个页面,有A连接,转到另一个页面有B连接,但是新用户进入C,他看到A或B直到它被更改...真的很沮丧,不能使用每个用户的singleton... - matiaslauriti

0
不,PHP并不像ASP.NET那样愚蠢(它真的会这样吗?)。在PHP中,静态变量是每个实例的(不像ASP.NET,整个页面是一个实例,每个用户都有自己的PHP实例)。
如果两个用户访问一个PHP页面,并且在一个页面上运行MyClass::$myVar = true,它不会影响另一个用户。

为什么这很愚蠢?静态变量不是会话变量。从你所说的来看,php页面上的静态变量与用户有关系,那么这怎么可能呢?如果用户没有cookie,那么静态变量就没有关联,每次都会产生新的静态变量吗?我认为微软做得很好,静态变量是针对池子的。 - Aristos
ASP.NET用户会话变量可以按您所说的方式执行。另一方面,PHP如何在所有运行实例中保留公共数据?例如,我使用静态来声明某些不可更改且在所有用户上经常使用的内容,您如何在PHP上实现这一点? - Aristos
@Aristos: "声明一些在所有用户中都不会改变且经常使用的内容",你可以选择不声明,或者将其存储在数据库中。 - gen_Eric
@Aristos:“Static不是会话变量”。是的。会话通过不同的请求存在,静态变量则不然。当脚本完成时,PHP退出,所有变量都被垃圾回收(除了cookie/session)。 - gen_Eric
@Aristos:在ASP.net中,静态变量对于所有用户都是相同的。而在PHP中,每个用户都有自己的副本。 - gen_Eric
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接