1. ホーム
  2. php

[解決済み] オートロードとは何ですか; spl_autoload、__autoload、spl_autoload_register はどのように使うのですか?

2022-01-29 14:35:27

質問

私はPHPの高度な標準を学び、新しい便利なメソッドを実装しようとしています。以前、私は __autoload は、各ページに複数のファイルを含めることを避けるためだけのものでしたが、最近になって __autoload manual

spl_autoload_register() は、より柔軟な代替手段を提供します。 クラスをオートロードします。このため __autoload() は 将来的には推奨されないか、削除される可能性があります。

を実装する方法がわからないのです。 spl_autoload spl_autoload_register

解決方法は?

spl_autoload_register() を使用すると、複数の関数 (あるいは Autoload クラスのスタティックメソッド) を登録することができます。

だから例えば

spl_autoload_register('myAutoloader');

function myAutoloader($className)
{
    $path = '/path/to/class/';

    include $path.$className.'.php';
}

//-------------------------------------

$myClass = new MyClass();

上の例では、"MyClass" がインスタンス化しようとしているクラスの名前です。PHP はこの名前を文字列として spl_autoload_register() この変数を使用して、適切なクラス/ファイルをインクルードすることができます。その結果、特にinclude/requireステートメントでそのクラスをインクルードする必要はありません...。

上の例のように、インスタンス化したいクラスを単純に呼び出すだけでよく、関数を登録したので ( spl_autoload_register() ) が、すべてのクラスがどこにあるのかを調べ、PHP はその関数を使用します。

を使用する利点は spl_autoload_register() とは異なり __autoload() を使えば、作成するすべてのファイルにオートロード関数を実装する必要はありません。 spl_autoload_register() また、複数のオートロード関数を登録することで、オートロードを高速化し、さらに簡単にすることができます。

spl_autoload_register('MyAutoloader::ClassLoader');
spl_autoload_register('MyAutoloader::LibraryLoader');
spl_autoload_register('MyAutoloader::HelperLoader');
spl_autoload_register('MyAutoloader::DatabaseLoader');

class MyAutoloader
{
    public static function ClassLoader($className)
    {
         //your loading logic here
    }


    public static function LibraryLoader($className)
    {
         //your loading logic here
    }


についてですが spl_autoload と、マニュアルに記載されています。

この関数は、デフォルトの実装として __autoload() . 他に何も指定がなく spl_autoload_register() がパラメータなしで呼び出された場合、この関数はそれ以降の __autoload() .

より現実的な話として、すべてのファイルがひとつのディレクトリにあり、 アプリケーションが .php ファイルだけでなく、たとえば .inc 拡張子のあるカスタム設定ファイルを使用している場合、 すべてのファイルを含むディレクトリを PHP のインクルードパスに追加する方法があります (via. set_include_path() ).
また、設定ファイルも必要なので、その場合は spl_autoload_extensions() を使用して、PHP に探させたい拡張子を列挙します。

set_include_path(get_include_path().PATH_SEPARATOR.'path/to/my/directory/');
spl_autoload_extensions('.php, .inc');
spl_autoload_register();

spl_autoload はデフォルトで __autoload() マジックメソッドで、新しいクラスをインスタンス化しようとすると PHP は spl_autoload をコールします。

お役に立てれば幸いです...