2010-02-18 2 views
2

나는 vb.net에서 일하는 나이에 PHP로 뛰어 들고있다.PHP 싱글턴 : 인스턴스를 가지고 있지 않다.

은 여기, 내 웹 애플리케이션을 통해 singleon으로 코드를 실행하는 로거 클래스 쓰기 싶어 :

class cLog{ 

private $data = NULL; 


static private $instance = NULL; 

static public function getInstance(){ 
    if(self::$instance == NULL){ 
     echo "empty!"; 
     self::$instance = new cLog();   
    } 
    return self::$instance; 
} 


private function __construct(){  
} 
private function __clone(){  
} 



public function getData(){ 
    return self::getInstance()->data; 
} 

public function trace($o){ 
    self::getInstance()->data[] = $o; 
} 

} 

내가 기대하는 것은, 즉 내가 방해에 여러 통화를 내 응용 프로그램의 페이지 사이를 전환로 :: trace() 메서드는 데이터 배열이 증가하고 모든 추적으로 채워집니다. 하지만 내가 얻을 수있는 것은 : 매번 페이지를 실행할 때마다 $ 인스턴스가 null이므로 개체가 다시 시작됩니다 (인스턴스 게터에 "빈"! 줄이 표시됨 : 매회 나타남)

답변

8

PHP는 "공유 없음"아키텍처를 사용합니다. 이것은 (다른 것들 중에서도) 페이지로드 사이에 아무 것도 공유되지 않는다는 것을 의미합니다. 응용 프로그램이 첫 번째 페이지에서 시작되고 중지 될 때까지 실행되는 .NET과 달리 요청이 오면 서비스를 제공합니다. PHP에서는 페이지가 요청 될 때마다 애플리케이션이 기본적으로 컴파일되고 처음부터 실행됩니다.

5

PHP의 라이프 사이클로드 "페이지 시작부터입니다

cLog::getInstance()->trace("hello world"); 
$logs = cLog::getInstance()->getData(); 

감사 : .... 내가 PHP 애플리케이션 라이프 사이클에 오해가있어 거기에 뭔가

를 추측하는 것은 여기에 사용 예제있다 "페이지로드를 종료합니다.

일반적으로 말해서 새 페이지를로드 할 때마다 모든 것이 처음부터 시작됩니다.

로거가 원하는 방식으로 작동하도록 세션 데이터로 재미있는 일을 할 수 있습니다.

행운을 빈다.

1

는하지만 내가 얻을 것은 : 개체가 다시 시작 그래서 페이지를 실행할 때마다이는 $ 인스턴스가 null ... 내가 PHP 애플리케이션 라이프 사이클에 오해가있어 뭔가가있을 것 같아요 ....

PHP의 응용 프로그램 수명주기는 HTTP의 수명주기를 반영합니다. 페이지/URI에 대한 각 요청은 stateless입니다. 각 요청은 다른 요청에 대해 아무것도 모릅니다. 이는 의도적으로 설계된 동작입니다. 당신이 묘사 한 행동은 PHP가해야 할 행동입니다.

다른 요청에서 일어난 일에 대해 각 요청을 알리려면 추가 단계를 수행해야합니다. (PHP의 세션 처리는 이것을 수행하는 한 방법입니다)

0

PHP의 응용 프로그램 수명주기에 관한 질문 대신, 미리 작성된 로깅 클래스 사용에 대한 권장 사항을 작성하고자합니다.

Zend Framework에는 Factory 패턴을 사용하는 Zend_Log가 있으며 데이터베이스, 파일 시스템, 전자 메일 등에 기록하기위한 다양한 Writer 개체가 있습니다.

http://framework.zend.com/manual/en/zend.log.writers.html

당신은 라이브러리의 다른 부분을 필요로하지 않고 Zend_Log을 사용할 수 있습니다, 그래서 현재 시스템에 적응이 용이해야한다.

+0

좋은 제안이지만 제 purpouse는 PHP 기능을 사용합니다.코드 복사를 시작하면 일부 스크립트를 디버깅하는 데 문제가 있음을 알게 될 것입니다. 스크립트가 작동하는 방식조차 모릅니다. 어쩌면 내가 한 번 해보고 영감을 얻지 만 내 수업의 실제 문제 (내 문제)는 내가 .NET에서 더 이상 개발하지 않는다는 것을 이해하지 못했다는 것입니다. – balanza

관련 문제