2013-01-04 3 views
2

저는 최근에 객체를 인스턴스화하고 객체 속성에 일부 데이터를 할당 한 다음에 호출을 수행하는 코드를 작성했습니다. 뭔가를하기위한 방법. 루프에서 코드를 실행할 때

는하지만, 그것이 작동하는 데 실패하고 난 이유를 이해할 수 없었다, 내 예제 코드는 다음과 같습니다 -

컨트롤러 기능 : -

$arrayOfObjects = SomeClass::getItems(); 
foreach ($arrayOfObjects as $object) { 
    SomeOtherObject::getInstance($object, time())->run(); 
} 

SomeOtherObject ::의 getInstance() : -

public static function getInstance($object, $timestamp) { 
    if (!(self::$_instance instanceof self)) { 
     self::$_instance = new self($object, $timestamp); 
    } 
    return self::$_instance; 
} 

private function __contruct($object, $timestamp) { 
    $this->_theObjectPassed = $object; 
    $this->_theTimestampPassed = $timestamp; 
} 

SomeOtherObject의 run 메소드가 예상 한대로 작동하지 않는다는 것이 나를 당혹스럽게 만들었습니다. 루프 내에서 디버깅을 추가 할 때, 즉 $ 객체에 getName() 메소드를 출력하면 루프의 각 항목에 대해 동일한 항목이 생깁니다. 나는 (의 getInstance()를 대신)는 일 다음에 객체를 생성하는 방식을 변경하는 경우

: -

$someOtherObject = new SomeOtherObject($object, time()); 
$someOtherObject->run(); 

내가 추측하고있어 그 길을 함께 할 수있는 뭔가가 getInstance 메소드의 작품 그것은 어떻게 체크하고 있는가? 그러나 누군가가 그것을 설명 할 수 있는지 궁금해했다.

감사합니다.

+1

SomeOtherObject ::의 getInstance() 귀하의 예제에서 싱글 생성 방법과 같은 역할을합니다. $ _instance는'getInstance()'의 첫 번째 호출 이후 한 번만 생성됩니다. 다음 호출에서 항상 한 번 생성 된 동일한 객체에 대한 참조를 반환합니다. 이게 문제 야? (내가 올바른 질문을 이해할 수 있는지 확실하지 않음) – hek2mgl

답변

2

정적 변수를 오해 한 것처럼 보입니다. 정적 변수는 객체 당 한 번이 아닌 클래스 당 한 번만 생성되고 초기화됩니다 ().

if 문은 $ _instance가 초기화되지 않은 경우 처음으로 getInstance()이 호출 된 경우에만 true입니다. SomeOtherObject의 새 인스턴스에 대한 참조가 할당됩니다.

다음의 모든 호출에서 if는 false를 반환하고 기존 $ _instance는 새 값을 만드는 대신 반환됩니다.

는 getInstance() 메소드에서 if 문을 제거

public static function getInstance($object, $timestamp) { 
    return new self($object, $timestamp); 
} 
+0

감사합니다. if와 관련 있다고 생각합니다. –

+0

좋습니다! 위의 주석에서 언급 한 것처럼 PHP에서 싱글 톤을 읽어야합니다. 그렇다면 if에 대해 알게 될 것입니다. ;)하지만 경고를 받으면, 싱글 톤 패턴이 실제로 적용된다는 이유로 PHP에서 몇 가지 이유가 있습니다. 재미있게 놀아 라! :) – hek2mgl