サーチ…


構文

  • 要求する
  • spl_autoload_require

備考

オートロードは、フレームワーク戦略の一環として、書かなければならない定型コードの量を容易にします。

インラインクラス定義、ロード不要

// zoo.php
class Animal {
    public function eats($food) {
        echo "Yum, $food!";
    }
}

$animal = new Animal();
$animal->eats('meat');

PHPはnew Animalファイルを実行する前にAnimalが何であるかを知っています。PHPがソースファイルをトップからボトムまで読み込むためです。しかし、定義されているソースファイルだけでなく、多くの場所で新しいAnimalsを作成したい場合はどうでしょうか?これを行うには、クラス定義をロードする必要があります。

必要な手動クラスロード

// Animal.php
class Animal {
    public function eats($food) {
         echo "Yum, $food!";
    }
}

// zoo.php
require 'Animal.php';
$animal = new Animal;
$animal->eats('slop');

// aquarium.php
require 'Animal.php';
$animal = new Animal;
$animal->eats('shrimp');

ここには3つのファイルがあります。 1つのファイル( "Animal.php")がクラスを定義します。このファイルには、クラスを定義するだけでなく、副作用がなく、「動物」についての知識がすべて1つの場所に整えられます。それは簡単にバージョン管理されています。簡単に再利用できます。

2つのファイルは、手動でファイルをrequireにより、 "Animal.php"ファイルを消費します。ここでも、PHPはソースファイルをトップからボトムまで読み込むので、requireは "Animal.php"ファイルを見つけて、 new Animal呼び出す前にAnimalクラス定義を利用可能にします。

new Animalをやりたいと思っていた数十、数百のケースがあったとしましょう。それはコードを書くのが非常に面倒な多くの、多くのrequireステートメントをrequireします。

オートローディングはマニュアルクラス定義の読み込みを置き換えます

// autoload.php
spl_autoload_register(function ($class) {
    require_once "$class.php";
});

// Animal.php
class Animal {
    public function eats($food) {
         echo "Yum, $food!";
    }
}

// zoo.php
require 'autoload.php';
$animal = new Animal;
$animal->eats('slop');

// aquarium.php
require 'autoload.php';
$animal = new Animal;
$animal->eats('shrimp');

これを他の例と比較する。 require "Animal.php"require "autoload.php"に置き換えられていることに注意してください。実行時には外部ファイルも含めていますが、 特定のクラス定義を含めるのではなくすべてのクラスを含むことができるロジックが含まれています 。私たちの開発を容易にする間接的なレベルです。代わりに1が書くのrequire我々が必要とするすべてのクラスのために、我々は1つが書き込みをrequireするすべてのクラスのために。 N requireを1 require置き換えることができrequire

魔法はspl_autoload_register起こります。このPHP関数はクロージャを取り、クロージャのキューにクロージャを追加します 。 PHPが定義を持たないクラスに遭遇すると、PHPはクラス名をキュー内の各クロージャに渡します。クロージャを呼び出した後にクラスが存在する場合、PHPは以前のビジネスに戻ります。キュー全体を試した後にクラスが存在しない場合、PHPは「Class 'Whatever' Not Found」でクラッシュします。

フレームワークソリューションの一部としてオートローディング

// autoload.php
spl_autoload_register(function ($class) {
    require_once "$class.php";
});

// Animal.php
class Animal {
    public function eats($food) {
         echo "Yum, $food!";
    }
}

// Ruminant.php
class Ruminant extends Animal {
    public function eats($food) {
        if ('grass' === $food) {
            parent::eats($food);
        } else {
            echo "Yuck, $food!";
        }
    }
}

// Cow.php
class Cow extends Ruminant {
}

// pasture.php
require 'autoload.php';
$animal = new Cow;
$animal->eats('grass');

一般的なオートローダーのおかげで、私たちのオートローダー命名規則に従ったクラスにアクセスすることができます。この例では、慣習は簡単です:目的のクラスは、クラス名と同じディレクトリにあり、 ".php"で終わるファイルを持つ必要があります。クラス名がファイル名と完全に一致することに注意してください。

オートローディングを行わなければ、手動で基本クラスをrequireとします。動物園の動物園全体を構築した場合、単一のオートローダーで簡単に置き換えることができる何千ものrequireステートメントがあります。

最終的な分析では、PHPオートローディングは、機械的なコードを少なく書くことができるようにするためのメカニズムで、ビジネス上の問題の解決に集中できます。 クラス名をファイル名にマップする戦略を定義するだけです。ここで行ったように、独自の自動ロード戦略をロールバックすることができます。または、PHPコミュニティで採用されている標準のPSR-0またはPSR-4を使用できます。あるいは、 コンポーザーを使用して、これらの依存関係を総称的に定義して管理することができます。

Composerを使ったオートロード

Composerはvendor/autoload.phpファイルを生成します。

あなたは単にこのファイルを含めることができ、あなたは無料でオートローディングを受けるでしょう。

require __DIR__ . '/vendor/autoload.php';

これにより、サードパーティの依存関係を簡単に処理できます。


autoloadセクションをcomposer.json追加することで、オートローダに独自のコードを追加することもできます。

{
    "autoload": {
        "psr-4": {"YourApplicationNamespace\\": "src/"}
    }
}

このセクションでは、オートロードマッピングを定義します。この例では、名前空間のディレクトリへのPSR-4マッピングがあります/srcディレクトリは、 /vendorディレクトリと同じレベルのプロジェクトルートフォルダにあります。サンプルのファイル名は、 YourApplicationNamespace\Fooクラスを含むsrc/Foo.phpです。

重要: autoloadセクションに新しいエントリを追加した後、 dump-autoloadコマンドを再実行して、 vendor/autoload.phpファイルを再生成して新しい情報で更新する必要があります。

PSR-4オートローディングに加えて、ComposerはPSR-0classmap 、およびfiles自動ロードをclassmapしていfiles 。詳細については、 オートロードリファレンス参照してください。


/vendor/autoload.phpファイルをインクルードすると、Composer Autoloaderのインスタンスが返されます。インクルード呼び出しの戻り値を変数に格納し、さらに名前空間を追加することができます。これは、例えば、テストスイート内のクラスのオートローディングに便利です。

$loader = require __DIR__ . '/vendor/autoload.php';
$loader->add('Application\\Test\\', __DIR__);


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow