2010-12-31 13 views
2

私は、自分のクラスにstandartオートローダーをspl_autoload_registerを使って作っています。しかし、私は問題があります。 spl_autoload_register new演算子を使用してクラスをインスタンス化するときにのみmakeを実行します。だから、私は:$singleton = Name\Singleton::get_instance()コードでは、オートローダが動作しないと私はこのファイルを手動で含める必要があります。どのように私はこの問題を解決することができますか?PHP、シングルトンのオートローディング

答えて

3

これは、彼らが必要としている時はいつでもクラスが自動的にロードされ、場合であってはなりません。名前空間を使用している場合は、名前空間/クラス名が正しいことを確認してください。 var_dump(class_exists('Name\Singleton'));を実行して、クラスが存在するかどうかを確認することもできます。これは、オートローダーを確実に使用するためのものです。

3

関係なく、あなたがオブジェクトを作成したり、彼らがロードされます静的クラスにアクセスして乗り切ります。クラスは、したがって、その範囲内で解決演算子::前にロードされるよう

あなたの例では、ファイルを動作します。

あなたは、あなたのオートローダちょうどaswellを得るのを助けるために、以下のリンクをご覧ください。

$App = new SplClassLoader('MyApp', '/myapp'); 
    $App->register(); 

http://groups.google.com/group/php-standards/web/psr-0-final-proposal

と名前空間の提案として

http://gist.github.com/221634

は、すべてのルート名前空間を使用すると、(GitHubのバージョンで)次の操作を行います \<Vendor Name>\(<Namespace>\)*<Class Name>ベンダーであるべきことが述べられています

名前空間を少し手伝ってくれるアップデート。

はDoctrineの呼び出しがEntityManagerのクラスの名前空間MyApp\Classes\Doctrine\Commonになり

namespace MyApp\Classes; 

class SomeClass 
{ 
    public function __construct() 
    { 
     $Doctrine = Doctrine\Common\EntityManager::Singleton(); 
    } 
} 

この例を見てみましょう。

Doctrine名前空間の外側に\という文字列を追加する必要がある場合は、現在の名前空間にないと言うには、常に\と指定する必要があります。

あなたの記事には、これがうまくいかない理由があります。

+0

+1私たちはDoctrine2/Symfony2のオートローダーも独自に使用しています。魅力のように動作します。 – DrColossos

+0

私はドクトリン/ゾンデなどがすべて紙に従うと信じています。 – RobertPitt

0

私は@Seldaekに同意するだろうし、あなたからメソッドを呼び出している名前空間になります。静的メソッドを呼び出すとき、あなたはどの名前空間にいますか? 'Name'名前空間にいる場合は、クラス名の前に名前空間名を付ける必要はありません。別の名前空間にいる場合は、メソッド名前に '\'を付けて、ルート名前空間に戻る必要があります($singleton = \Name\Singleton::get_instance()など)。

1

実際の名前空間はちょっと台無しになりました。

あなたは、おそらくこのような何かやっているシングルトンだ場合:

自己:: $ _インスタンス=新しい自己を(); 、Actualy私はこの答えに間違っていた:それそれはいくつかの邪悪な理由でオートローダにstdClassを投げるだろう、と私は、トンでも理由を理解または溶液

編集を見つけることができるので、めちゃくちゃになります

私は実際にはコンストラクタのstdClassを使用していましたので、グローバルなスペースを使用する関数を使用してインポートしなければなりませんでした。実際には(オブジェクト)のキャストを使用していました。

stdClassをインポートした後、シングルトンはちょうど働いた

関連する問題