0

このメソッドを使用してクラスをロードしています:

spl_autoload_register(function($class) {
    require_once 'classes/' . $class . '.php';
});

その機能について、私が理解するのに苦労していることがまだいくつかあります。

私が理解しているように、オブジェクト インスタンスを作成するたびに、関数がトリガーされ、オブジェクトのクラスが読み込まれます。

だから、もし私が次のようなことをしたとしたら:

$myObj = new myObj();

関数はこの宣言をキャッチし、require_once 'classes/myObj.php'.

別のインスタンスを作成するとどうなりますか? 例えば:

$myObj1 = new myObj();
$myObj2 = new myObj();

関数を2回トリガーしますか?それとも同じクラスであることに気づいているので、それを2回宣言しませんか?いずれにせよ、それが私が使用した理由なrequire_onceので、過負荷にならないようにします。それでも、それが実際に何をするのか知りたいです。

もう1つ、なぜ私はこのようなコードをやっているのですか:

echo someOtherClass::getDesc();

関数はこれをクラス宣言として認識し、ファイルを必要としますclasses/someOtherClass.php。なぜそれが起こっているのですか?私は新しいオブジェクトを宣言していません。実際、someOtherClass のインスタンスであるオブジェクトはありません。オブジェクト関数を使用しているときはいつでも、クラスをインクルードしようとするということですか? またはいつでも静的関数を使用できますか?

前もって感謝します!

4

1 に答える 1

1

基本的に、定義されていないクラスに遭遇すると、autoload スタックに登録されている関数を 1 つずつ呼び出し、クラスが定義されているかどうかを各呼び出しの後にチェックします。定義されている場合は、ローダーの呼び出しを停止し、スクリプトの実行に戻ります。

したがって、require_once と実質的に同じであり、はい、宣言されていないクラスの静的メソッドを呼び出すと、オートロードがトリガーされます。

autoload は例外「クラスが宣言されていません」ハンドラーと考えることができます。これは、スクリプトを続行できるように修正することを目的としています。

于 2013-10-22T10:38:08.830 に答える