2012-05-23 33 views
7

Biến tĩnh trong ASP.NET khiến tôi mất cảnh giác hôm nay. Sau đó, tôi đã trở thành freaked ra, bởi vì điều này có nghĩa hoặc là tôi có một sự hiểu lầm cơ bản của các biến tĩnh trong thế giới của web hoặc ASP.NET không hành động như tôi nghĩ rằng nó sẽ.Biến cố PHP và ASP.NET tĩnh

Vì vậy, trong ASP.NET

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

Nếu ASPUserA đặt MyClass.myVar = false mỗi người dùng khác trên hệ thống sẽ trải nghiệm những thay đổi này. Vì vậy, ASPUserB sẽ có myVar = false. Nguồn của tôi: http://www.foliotek.com/devblog/avoid-static-variables-in-asp-net/

class MyClassPHP { 
    public static $myVar = false; 
} 

Nếu PHPUserA đặt MyClass::$myVar = true Điều này có nghĩa là mỗi người dùng trên hệ thống trải qua những thay đổi này ???

Cảm ơn bạn.


Khi nghiên cứu thêm tôi đã thực hiện việc này;

class MyClassPHP { 
    public static $myVar = 0; 
} 

Sau đó, tôi đã có những người dùng đến một trang làm điều này

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

Nó luôn luôn là 1. Không có vấn đề bao nhiêu lần tôi làm mới hoặc đồng thời kết nối ... WOHHH đó là một kết luận rất lớn, hoặc người nào khác tôi đang say!


ASP.NET cập nhật

Sau khi nghiên cứu và thử nghiệm thêm nữa điều tôi thấy điều này.

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

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

} 

Sau đó, trang của tôi có thể hiển thị myInt.

Giữa các trình duyệt (Firefox và chrome) số myInt tăng dần khi tôi làm mới trang. Vì vậy, điều này không quan trọng nếu class của bạn là static. Nó chỉ quan trọng nếu bạn có các biến tĩnh. Họ là ứng dụng rộng.

+2

WOW!ASP.NET có thực sự làm điều đó không? Đó là ngu ngốc =/ –

+2

Tôi rất bối rối bởi nó. Nó loại thổi các Paradigms của tôi ra ngoài cửa sổ! – Michael

+2

Cảm ơn bạn đã thuyết phục tôi * không bao giờ * sử dụng ASP.NET ;-P –

Trả lời

7

Khi chạy trong IIS:

Biến tĩnh không phải là "trang" cụ thể. Đó là "AppDomain" cụ thể. Mối quan hệ duy nhất với "trang" sẽ là đường dẫn (để nói) của biến (MyProject.MyPage.MyVariable chẳng hạn). Bởi vì tất cả người dùng ứng dụng của bạn đang chạy trong cùng một AppDomain (tức là cùng một thư mục ứng dụng IIS), thì tất cả họ sẽ sử dụng cùng một biến tĩnh. Vì vậy ... cuối cùng người dùng của bạn sẽ xem thông tin của nhau vì họ đều chia sẻ một biến tĩnh duy nhất.

Tuy nhiên, PHP theo dõi số liệu thống kê PER USER INSTANCE, vì vậy, tôi đoán bạn có thể gọi chúng là "an toàn hơn từ vùng nguy hiểm đơn".

+1

Công việc tốt Microsoft. =/ –

+3

Tôi có nghĩa là nó không ... khủng khiếp? Bạn có để có được xung quanh nó trong một số trường hợp, nhưng ở những người khác của nó AWESOME khi nói đến quản lý bộ nhớ. Sau đó, bạn có thể có một đối tượng duy nhất hoạt động cùng một chức năng trên một nhóm người dùng thay vì có 10 bản sao của cùng một đối tượng đang làm điều tương tự. Tôi đoán nó chỉ là một vấn đề ưu tiên: D –

+0

Đây là cũ, nhưng đây không phải là một vấn đề ưu tiên, một trang được accesed bởi nhiều hơn một người dùng, do đó, behaivor bình thường sẽ là một trong PHP, không ASP.Net. .. đây không phải là một dạng Windows là người dùng đơn ... nó thực sự phát triển các mô hình của bạn như singleton để quản lý cơ sở dữ liệu nhưng với các truy vấn kết nối khác nhau ... một người dùng vào một trang, có kết nối, thay đổi sang trang khác có kết nối B , nhưng một người dùng mới đi đến C, và anh ta thấy A hoặc B cho đến khi nó được thay đổi ... thực sự bực bội để không thể sử dụng Singleton PER USER ... – matiaslauriti

0

Không, PHP không ngu ngốc như ASP.NET (thực hiện nghiêm túc điều đó không?). Các biến tĩnh trong PHP là một ví dụ (nó không giống như ASP.NET, nơi toàn bộ trang là một cá thể, mỗi người dùng nhận được cá thể PHP của chính họ).

Nếu 2 người dùng truy cập trang PHP và trên một trang MyClass::$myVar = true được chạy, nó không ảnh hưởng đến người dùng khác.

+0

tại sao điều này là ngu ngốc? Tĩnh không phải là biến phiên. Từ những gì bạn nói các trang tĩnh trên các trang php được kết nối với người dùng, và làm thế nào mà có thể được? Nếu người dùng không có cookie? sau đó tĩnh không được kết nối và mỗi lần một tĩnh mới sinh ra? Tôi nghĩ rằng MS thực hiện một công việc tuyệt vời, tĩnh là những gì được nói cho các hồ bơi. – Aristos

+0

asp.net biến Session người dùng làm những gì bạn nói. Mặt khác làm thế nào php giữ dữ liệu phổ biến trên tất cả các trường hợp đang chạy? Ví dụ tôi sử dụng tĩnh để khai báo một cái gì đó mà không phải là thay đổi và được sử dụng rất nhiều trên tất cả người dùng, làm thế nào bạn làm điều đó trên php? – Aristos

+0

@Aristos: "tuyên bố điều gì đó không thay đổi và được sử dụng nhiều trên tất cả người dùng" Bạn không, hoặc bạn lưu trữ nó trong cơ sở dữ liệu. –