2012-02-15 2 views
5

의도 한대로 작동하는 오토로더 클래스를 만들었지 만 이상한 행동을 발견했습니다. 내가 찾은 클래스의 결과가 spl_autoload_register() 함수를 처리하는 메소드에 전달된다. 나는 내가 두 배나되는 것을보고있다. 스크립트가 두 번 호출되고, 그 싱글 톤 데이터가 내 경우에 2 개의 배열을 만들기 때문에. 내 싱글에게PHP 싱글 톤이 오토로더 클래스에서 두 번 계속 호출 함

public static function init() 
{ 
    if (!isset(self::$instance)) 
     self::$instance = new self(); 

    return self::$instance; 
} 

을 만들려면이 방법을 사용하고

그때 비공개로 설정 생성자가 있습니다. 각 메소드가 자신의 클론을 생성하는 것으로 보이는 곳을 디버깅하면서 보았습니다.

그 문제에 대한 클래스와 클래스가 spl_autoload_register() 함수의 어딘가에서 복제 된 것으로 의심됩니다.

어떤 도움을 주시면 감사하겠습니다.

+0

당신이 따라 __clone 기능을 설정 //? – busypeoples

+0

전체 클래스 코드를 게시 할 수 있습니까? – busypeoples

+0

오케이, 게시 됨. 만약 내가이 아닌 싱글 톤 인스턴스를 실행하면 자체 복제되지 않습니다. – Eli

답변

3

생성자가 어떤 것을 인쇄하도록하십시오. 그것이 실제로 한 번 이상 부름 받았는지보기 위해서. 두 대의 자동 로더를 사용하고 있습니까? 나는 응용 프로그램의 맨 처음 (아마도 index.php)에 sp_autoload_register를 설정하고 필요한 모든 자동 로더를 등록합니다. 그러나 먼저 컨스트럭터가 두 번 이상 호출되는지 테스트합니다.

// 우선이 변경 것 :

private static $instance = null; 

는 init 함수

public static function init() { 
    if (self::$instance === null) { 
    self::$instance = new Autoload(); 
    } 

    return self::$instance; 
} 
+0

카운터를 설정하고 클래스가 호출 될 때마다 실행되도록했습니다. 그리고 충분히 나는 +1을 얻는다. 내가 어디에 spl_autoload_register를 두길 바래? 이미이 index.php에서이 스크립트를 호출하고 있습니다. 업데이트 된 코드로 내 게시물도 업데이트했습니다. – Eli

+0

등록 방법 내에서 이에 대해 확실하지 않습니다. spl_autoload_register (array ('Autoloader', 'loadClass')); – busypeoples

+0

hmmm, 원래는 싱글 톤 라우트를 가기 전에'spl_auto_register ('self :: autoload()')'로 설정했습니다. – Eli

관련 문제