2012-10-23 9 views
0

메신저 C에서 # 그리고 나는 조금 더 배우려고 ... 이제 정적 ArrayList를 이해하는 데 어려움이 있습니다. PHP에서정적 ArrayList는 값을 메모리에 저장합니까?

난 정의 할 수

Class Singleton{ 
    private static $instance; 
    private static $arrayDemo = array(); 

    private function __construct(){} 

    public static function getInstance(){ 
     if(!isset(self::$instance)) 
      self::$instance = new Singleton(); 
     return self::$instance; 
    } 
    public static addItem($item){ 
     self::$arrayDemo[] = $item; 
    } 

    public static getItems(){ 
     return self::$arrayDemo[]; 
    } 
} 
Singleton::getInstance(); 

Singleton::addItem("first"); 
Singleton::addItem("second"); 
Singleton::getItems(); // returns {0=>first,1=>second} 

을 난 페이지를 재로드하는 경우 나 동일한 결과를 얻었다 (0 => 제 1 => 제)

임 C#의 단일 패턴을 구현하려고 내가 3 번 반환을 갱신하는 경우, 나는이 웹 사이트를 한 번 새로 고치면 내가 PHP와 같은 결과를 얻었다

public sealed class Singleton 
{ 
    private static readonly Singleton instance = new Singleton(); 
    private static ArrayList ArrayDemo = new ArrayList(); 

    private Singleton() { } 

    public static Singleton Instance 
    { 
     get 
     { 
      return instance; 
     } 
    } 


    public static void AddItem(string item) 
    { 
     ArrayDemo.Add(item); 
    } 

    public static ArrayList GetItems() 
    { 
     return ArrayDemo; 
    } 
} 

//in cshtml: 
Singleton.AddItem("first"); 
Singleton.AddItem("second"); 
Singleton.GetItems(); 

...하지만 .. : : 같은 일을 얻을 수 있습니다,하지만 난 값을 반복있어

0=>first,1=>second,2=>first,3=>second,4=>first,5=>second 

왜 이런 일이 발생합니까? 정적 메서드를 사용하면 새로 고침 ArrayList 결과를 지울 수 있습니까? 이 논리를 이해하고 싶습니다.

감사합니다.

+0

그게 문제입니다 : PHP는 * 실제 * 정적 인스턴스를 모른다 :) 참조 http://stackoverflow.com/questions/468642/is-it-possible-to-create-static-classes-in-php- like-in-c/468653 # 468653 and http://stackoverflow.com/questions/432192/singleton-in-php –

+1

@AndreasNiedermair 내가 C#에서 더 많은 것을 배울 때, 나는 PHP 세계에서 5 년을 잃었다 고 느꼈다 : ( – Carasuman

답변

2

왜 이런 일이 발생합니까?

정적 변수입니다. 그것은 생명의 한 부분 인 AppDomain만큼 오래 살며, 평생을 가정 한 것처럼 보이는 거의 항상 단일 요청보다 훨씬 길습니다. ASP.NET에서는 동일한 AppDomain이 많은 요청을 처리합니다. 각 요청에 대해 별도의 프로세스가 필요하지 않습니다.

나는 그것을 제안 :

  • 당신이 시작하기 위해 싱글 톤 패턴을 사용하지 마십시오; 매우 드물게 좋은 생각 당신은 효과적으로 일정 데이터 이외의 정적 변수 사용하지
  • (그렇다하더라도 가능성과 ...) 없습니다
  • 당신 대신에 일반적인 컬렉션을 선호, ArrayList 같은 제네릭이 아닌 컬렉션을 사용하지 당신은 C#을 처음 사용하는 경우 이러한 또한 List<T>

, 나는 당신이 시작하는 웹 파트를 폐기 좋을 것 - 웹과에 대한 자세한 내용은 자신의 단점을 리치 클라이언트 GUI 프레임 워크 모두; 언어과 기본 핵심 라이브러리 (예 : 컬렉션 및 IO)를 실험하고 싶다면이 목적으로 콘솔 앱을 사용하는 것이 훨씬 더 생산적이라는 것을 알 수 있습니다.

+0

나는 당신의 충고를 따를 것입니다. 내가 따라갈 때, 나는 이해하고 배우는 것이 훨씬 더 부족하다는 것을 느낍니다 .Btw, 단일 인스턴스에서 변수를 처리하려고한다면, 싱글 톤 패턴을 권장하지 않습니까? – Carasuman

+0

@Carasuman : 싱글 톤 패턴은 테스트하기 어려운 코드로 이어지며 특히 웹 응용 프로그램 내에서 변경 가능한 데이터에 적합하지 않습니다. 종속성 삽입은 일반적으로 여러 인스턴스에 동일한 인스턴스를 제공하는 데 도움이됩니다. 실제로 수행하려는 작업에 따라 달라집니다. –

+0

C#에서 처음부터 시작할 책을 제안 하시겠습니까?도움을 주셔서 감사합니다. – Carasuman

관련 문제