2012-05-23 18 views
7

Zmienne statyczne w środowisku ASP.NET zaskoczyły mnie dzisiaj. Wtedy zostałem przerażony, ponieważ oznacza to albo mam fundamentalne niezrozumienie zmiennych statycznych w świecie sieci, albo ASP.NET nie działa tak, jak myślałem.Zmienne statyczne PHP vs ASP.NET

Więc w ASP.NET

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

Jeśli ASPUserA ustawia MyClass.myVar = false co drugi użytkownik w systemie doświadczy tych zmian. Tak więc ASPUserB będzie miał myVar = false. Moja Źródło: http://www.foliotek.com/devblog/avoid-static-variables-in-asp-net/

class MyClassPHP { 
    public static $myVar = false; 
} 

Jeśli PHPUserA ustawia MyClass::$myVar = true to oznacza, że ​​każdy użytkownik w systemie doświadcza tych zmian ???

Dziękuję.


Po dalszych badaniach zrobiłem to;

class MyClassPHP { 
    public static $myVar = 0; 
} 

Wtedy miałem użytkownicy którzy przeszli na stronę zrobić to

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

To zawsze było 1. Bez względu na to, ile razy odświeżany lub jednoczesnych połączeń ... WOHHH że był wielkim wniosek, albo jestem wkręcony !!


aktualizacja ASP.NET

Po dalszych badań i testów rzeczy znalazłem to.

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

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

} 

Następnie moja strona może wyświetlić myInt.

Pomiędzy przeglądarkami (Firefox i chrome) myInt był stopniowo coraz wyższy podczas odświeżania strony. Nie ma to znaczenia, jeśli numer class to static. Ma znaczenie tylko, jeśli masz zmienne statyczne. Są szeroko stosowane.

+2

WOW!Czy ASP.NET naprawdę to robi? To głupie =/ –

+2

Jestem tak zdezorientowany. To niszczyło moje Paradygmaty przez okno! – Michael

+2

Dziękuję za przekonanie mnie * nigdy * do korzystania z ASP.NET ;-P –

Odpowiedz

7

Podczas pracy w IIS:

Zmienna statyczna nie jest specyficzna dla strony. Jest to specyficzne "AppDomain". Jedyną relacją do "strony" będzie ścieżka (że tak powiem) o zmiennej (MyProject.MyPage.MyVariable na przykład). Ponieważ wszyscy użytkownicy aplikacji działają w tym samym AppDomain (tj. Tym samym folderze aplikacji IIS), wszyscy użyją tej samej zmiennej statycznej. Więc ... w końcu Twoi użytkownicy będą widzieć informacje o sobie nawzajem, ponieważ wszyscy dzielą tę jedną statyczną zmienną.

PHP jednak śledzi statykę w UŻYCIU UŻYTKOWNIKA, więc domyślam się, że można je nazwać "bezpieczniej od singletonu dangerzone".

+1

Dobra robota Microsoft. =/ –

+3

Mam na myśli to, że nie ... okropne? W niektórych przypadkach trzeba go obejść, ale w innych jest NIESAMOWITE, jeśli chodzi o zarządzanie pamięcią. Wtedy możesz mieć pojedynczy obiekt obsługujący tę samą funkcję w grupie użytkowników, zamiast mieć 10 kopii tego samego obiektu, robiąc to samo. Myślę, że to tylko kwestia preferencji: D –

+0

To jest stare, ale nie jest to kwestią preferencji, strona jest odwiedzana przez więcej niż jednego użytkownika, więc normalnym behaivorem byłby PHP, a nie ASP.Net. .. to nie jest Windows Form, który jest pojedynczym użytkownikiem ... to naprawdę eksploduje twoje paradygmaty jak singleton do zarządzania bazą danych, ale z różnymi zapytaniami o połączenie ... jeden użytkownik wchodzi na jedną stronę, ma połączenie, zmiany na innej stronie ma połączenie B , ale nowy użytkownik przechodzi do C, i widzi A lub B, dopóki się nie zmieni ... naprawdę frustrujące, że nie można używać singletona PER USER ... – matiaslauriti

0

Nie, PHP nie jest tak głupi jak ASP.NET (czy to naprawdę robi?). Zmienne statyczne w PHP są na przykład (nie jest tak, jak ASP.NET, gdzie cała strona jest jedną instancją, każdy użytkownik otrzymuje własną instancję PHP).

Jeśli 2 użytkowników przejdzie na stronę PHP i na jednej stronie zostanie uruchomiony MyClass::$myVar = true, nie wpłynie to na drugiego użytkownika.

+0

dlaczego to jest głupie? Statyczny nie jest zmiennymi sesji. Z tego, co mówisz, że statyczne strony php są połączone z użytkownikiem i jak to może być? Jeśli użytkownik nie ma pliku cookie? to statyczność nie jest połączona i za każdym razem rodzi się nowy statyczny? Myślę, że stwardnienie rozsiane wykonało świetną robotę, statyczne jest to, co powiedzą dla basenu. – Aristos

+0

asp.net Zmienne sesji użytkownika, które robią to, co mówisz. Z drugiej strony, w jaki sposób php utrzymuje wspólne dane we wszystkich działających instancjach? Na przykład używam statycznego, aby zadeklarować coś, co nie jest zmienione i często używane dla wszystkich użytkowników, jak to robisz na php? – Aristos

+0

@Aristos: "zadeklaruj coś, co nie zmienia się i często używane na wszystkich użytkownikach" Nie masz, lub przechowujesz je w bazie danych. –