web-dev-qa-db-ja.com

オートローディングとはspl_autoload、__ autoload、spl_autoload_registerはどのように使用しますか?

私は高度なPHP標準を学び、新しい便利なメソッドを実装しようとしています。以前、私は__autoloadを使用して各ページに複数のファイルを含めてエスケープしていましたが、最近では __autoload manual のヒントを見ました

spl_autoload_register()は、クラスを自動ロードするためのより柔軟な代替手段を提供します。このため、__ autoload()の使用は推奨されておらず、今後廃止されるか削除される可能性があります。

しかし、私は本当に spl_autoloadspl_autoload_register を実装する方法を理解することはできません

183
diEcho

spl_autoload_register()を使用すると、PHPがスタック/キューに入れて「新しいクラス」が宣言されたときに順次呼び出す複数の関数(または独自の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拡張子を持つカスタム構成ファイルを使用する場合、使用できる1つの戦略は、すべてを含むディレクトリを追加することですPHPのインクルードパスへのファイル(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を呼び出します。

お役に立てれば...

299
Brownbay

PHP 5.3以降、名前空間でspl_autoload_register()を使用できます。つまり、__autoload()関数を再定義することなく、プロジェクトを整理し、PHPクラスをオートロードできます。

この動作を実証するには、index.phpというファイルを作成します。

<?php
spl_autoload_register();
var_dump(new Main\Application);

次に、index.phpファイルのすぐ横にあるMainという名前のフォルダーを作成します。最後に、MainにあるApplication.phpというファイルを作成し、次のコードをそこに貼り付けます。

<?php namespace Main;
class Application{}
12
user1974206

Autoloadの使用方法は次のとおりです。この例では、3つの異なるディレクトリからクラスをロードします。

function namespaceAutoload($rawClass){

$class = str_replace('\\', DIRECTORY_SEPARATOR, $rawClass);

$possiblePaths[] = '..\sys\class\file.php';
$possiblePaths[] = '..\sys\class\lib\file.php';
$possiblePaths[] = '..\sys\class\class.file.inc.php';

foreach ($possiblePaths as $templatePath) {
    $path = str_replace(["\\", "file"], [DIRECTORY_SEPARATOR, $class], $templatePath);
    if (file_exists($path)) {
        require_once "$path";
        break;
    }
} spl_autoload_register("namespaceAutoload"); 

与えられた例では、PHPはこれら3つの異なるファイル名形式を使用して、これら3つのディレクトリでnamespace\classを探します。

0
Augusto Santana