2012-02-15 4 views
5

私は目的どおりに動作するオートローダクラスを作成しましたが、私は奇妙な動作に気づきました。私が見つけたクラスの結果は、spl_autoload_register()関数を処理するメソッドに渡されます。私は倍を持っているのを見ている。スクリプトが2回呼び出された場合と同じように、データがシングルトンの場合は2つの配列が作成されるためです。phpシングルトンはオートローダクラスで2回自己呼び出しを続けます

私はその後、プライベートに設定されたコンストラクタを持っている私のシングルトン

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

コンストラクタに何かを出力させます。それが本当に1回以上呼び出されているかどうかを確認するだけです。 2台のオートローダーを使用していますか? 私はsp_autoload_registerをアプリケーションの初めに(おそらくindex.php)設定し、必要なオートローダーをすべて登録します。 しかし、コンストラクタが最初に複数回呼び出されているかどうかをテストします。

//最初私はこの変更になります。

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

関連する問題