7

今日、ASP.NET の静的変数に不意を突かれました。これは、Web の世界で静的変数を根本的に誤解しているか、ASP.NET が思ったように動作しないことを意味するためです。

したがって、ASP.NET では

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

ASPUserAMyClass.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。静的変数がある場合にのみ重要です。それらはアプリケーション全体です。

4

2 に答える 2

7

IIS で実行する場合:

静的変数は「ページ」固有ではありません。「AppDomain」固有です。「ページ」との唯一の関係は、変数 (たとえば、MyProject.MyPage.MyVariable) のパス (いわば) です。アプリケーションのすべてのユーザーが同じ AppDomain (つまり、同じ IIS アプリケーション フォルダー) で実行されているため、すべてのユーザーが同じ静的変数を使用します。そのため...最終的には、ユーザーはすべて1つの静的変数を共有しているため、お互いの情報を見ることになります.

ただし、PHPはユーザーインスタンスごとに静的を追跡するため、「シングルトンの危険ゾーンからより安全」と呼ぶことができると思います。

于 2012-05-23T20:10:48.383 に答える
0

いいえ、PHP は ASP.NET ほど愚かではありません (本気でそんなことをするのですか?)。PHP の静的変数はインスタンスごとです (ページ全体が 1 つのインスタンスである ASP.NET とは異なり、各ユーザーが独自の PHP インスタンスを取得します)。

2 人のユーザーが PHP ページにアクセスし、一方のページMyClass::$myVar = trueが実行された場合、もう一方のユーザーには影響しません。

于 2012-05-23T20:06:22.430 に答える