6

私は本当にspl_autoloadのドキュメントを取得していません

bool spl_autoload_register  ([ callback $autoload_function  ] )

私の理解では、phpがまだロードされていないクラスに遭遇したときに登録された関数を実行しようとします。たとえば、

public function autoload() {
    require ('nonLoadedClass.php');
}
spl_autoload_register(autoload);
$x = new nonLoadedClass();

require を実行させますか? 多くのオートロード関数も登録できますか?

public function autoloadXXX() {...}
public function autoloadYYY() {...}
public function autoloadZZZ() {...}
spl_autoload_register('autoloadXXX');
spl_autoload_register('autoloadYYY');
spl_autoload_register('autoloadZZZ');

教義の場合、

require_once(dirname(__FILE__) . '/lib/vendor/doctrine/Doctrine.php');
spl_autoload_register(array('Doctrine', 'autoload'));

配列が渡されたので、Doctrine クラス内で autoload 関数を実行しようとするのではないでしょうか (これは必須でした)?

4

3 に答える 3

16

spl_autoloader_registerコードが未知のクラスを使用しようとしたときに呼び出されるコールバック関数/メソッドを登録します。

コールバック関数は、いくつかの方法で記述できます。

  • 単純な関数名:'my_function'
  • クラスの静的メソッド:array('MyClass', 'myMethod')
  • クラスのインスタンスのメソッド:array($myObject, 'myMethod')

Doctrine の場合、2 番目の解決策のようです。PHP が認識しないクラスが使用されている場合、オートローダーは を呼び出しDoctrine::autoload、クラス名をパラメーターとして渡します。


多くのオートロード関数も登録できますか?

はい、できますspl_autoload_register

複数のオートロード機能が必要な場合は、これをspl_autoload_register() 許可します。自動ロード関数のキューを効果的に作成し、定義された順序で各関数を実行します。

しかし、私たちは通常、クラスごとに 1 つのオートローディング関数/メソッドを定義しません。それはかなり非効率的だと思います。

代わりに、オートローディング関数が受け取るクラス名を使用して、どのファイルを含めるかを決定します。

たとえば、オートロード関数は次のようになります。

function my_autoloader($className)
{
    require LIBRARY_PATH . '/' . $className . '.php';
}

秘訣は、ファイルに含まれるクラスに基づいてファイルの名前を付けると、すぐにはるかに簡単になるということです;-)

これが、多くの場合、クラスが PEAR 規則を使用して命名される理由My_Class_Nameです。ファイルにマップします。My/Class/Name.php

于 2009-12-14T05:34:09.817 に答える
1

あなたの発言全体が正しいです。

spl_autoload_register複数のオートロード関数を登録できます。PHP 環境にロードされていないクラスのオブジェクトを作成または使用しようとすると、PHP はそのクラスを探すためにすべての autoload 関数を実行します。

あなたが与えるDoctrineの例は、コールバックと呼ばれるものを使用して、クラス内にメソッドを登録しています。コールバックは、クラス名 (静的メソッドの場合) またはそのクラスのインスタンス (非静的メソッドの場合) とメソッド名を含む単純な配列です。

于 2009-12-14T05:34:23.357 に答える
0

言うことは正しい。不明なクラスがインスタンス化されたときに呼び出されます。その後、必要なファイルを含める/要求する機会が得られます。

関数がクラスにある場合は、配列を渡す必要があります。この場合、Doctrine クラスのインスタンスではなく Doctrine クラスを渡すため、これは静的関数です。

于 2009-12-14T05:33:40.533 に答える