PHP composer: autoload機能を有効活用しよう!

  • -

    シェア
  • ---

    LINEで送る
  • -

    はてなブックマーク
    ブックマーク
  • -

    pocket
  • -

    rss
他言語サイト
us us

phpのオートロードはクラスファイルをrequireで取り込みません。use演算子を使って自動的にクラスをロードする機能です。

オートロードは、phpパッケージを管理するcomposerで管理されます。

オートロードはphpの中で必ず習得しなければならない機能です。その機能の中身をくわしく、でも簡単に見ていきます。

autoloadの仕組み

.phpファイルをすべてrequireする必要がない

autoloadはすべての.phpファイルをrequireする必要がありません。

自作phpプログラムのクラスをautoloadで使うにはcomposer.jsonで設定します。

composerコマンドでインストールしたパッケージは、"require vendor/autoload.php"を1行記述すると、パッケージ内のクラスをautoloadで使うことができます。

vendor/autoload.phpファイルは、次のcomposerコマンドを実行したとき作成 / 更新を行います。

  • composer install
  • composer update
  • composer require

autoloadはクラス以外にもインタフェース、function、constもオートロードできます。オートロードの使い方はuse演算子で宣言するだけです。

<?php
require vendor/autoload.php;

use My\Full\ClassName as ClassName;
use My\Full\InterfaceName as IFName;

class Test extends ClassName implements IFName {
    // ...
}
 
// >= PHP 5.6
use function My\Full\functionName as func;

$ret = func();
 
// >= PHP 5.6
use const My\Full\CONSTANT CONST_A;

$val = CONST_A;

このように、.phpファイルの1つ1つをrequireする必要がないのでとても便利です。

  • autoloadを使うには、"require vendor/autoload.php"をソースコードに記述。
  • use演算子でクラス、インタフェース、function、constがオートロードできる。
  • 設定はcomposer.json
Laravelフレームワークでは、初期インストール時にpublic/index.phpでvendor/autoload.phpをrequireしているので、何もする必要はありません。composer.jsonも作成されます。

autoloadのファイルの場所

autoloadはそれ自体がcomposerのパッケージです。autoloadに依存したパッケージをインストールしたら、自動的にcomposerパッケージもインストールされます。

インストールされるリソースは、"vendor/autoload.php"と"vendor/composer/"ディレクトリ下に各種ファイルが作成されます。

autoloadにはいくつかの設定方法があって、その種類ごとにclassと.phpファイル、namespaceと.phpファイルなどを紐づけたデータが.phpファイルに保存されます。

それらの設定ファイルは、"vendor/composer/"に作成されます。中身は配列データです。

  • autoload_classmap.php
  • autoload_files.php
  • etc...

このvendor/composer/に作成された配列データを集約したファイルがvendor/autoload.phpです。

  • require vendor/autoload.phpでコードの読み込み
  • vendor/composer/***.phpファイルからオートロードを実行

という流れでautoloader機能は動作します。

composer.jsonの書き方はあとで説明します。まずは、autoloadの設定手順から見ていきましょう。

autoloadの設定手順

autoloadの設定はcomposer.jsonファイルに記述します。composer.jsonファイルが存在しない場合は作成する必要があります。

これから説明で使うcomposerコマンドは、user_home/bin/composerにあるものとします。

composer.jsonファイルの作成

PHPプログラムのホームディレクトリにcomposer.jsonファイルを作成します。新規作成の場合は、ホームディレクトリで、

php ~/bin/composer init

を実行します。いろいろと入力を求められますが、あとで編集可能なので、とりあえず全部Enterでいいです。

composer.jsonファイルの編集

autoloadに関する設定は、

"autoload": {

}

の部分だけです。ここでは完成したサンプルをお見せします。

{
    "name": "my_pkg/laravel-ext",
    "description": "Extended or customized package of Laravel",
    "license": "MIT",
    "authors": [
        {
            "name": "******",
            "email": "*****@******"
        }
    ],
    "require": {
        "php": ">=7.0.0"
    },
    "autoload": {
        "psr-4": {
            "MY_PKG\\": "src/MY_PKG/"
        }
    },
    "config": {
        "sort-packages": true
    }
}

サンプルは、Laravelの拡張機能プログラムのパッケージです。Laravelはpsrに準拠しているのでpsr-4を設定します。

くわしくはあとで説明しますが、Laravelなどpsrに準拠するアプリケーションではpsr-4だけ設定していればよいです。
PSR (PHP Standards Recommendations)

PHP標準勧告。

PHPコーティングの標準化を目指す活動のこと。PHP-FIGが策定している。

PHP-FIG (PHP Framework Interop Group)

PHPフレームワーク相互運用グループ。

PHPプロジェクトが集まって意見を出し合い、お互いの製品の互換性を調整する団体。

有名なプロジェクトが多く参加している。

composer.jsonの構文チェック

composer.jsonファイルのあるディレクトリでコマンドを実行して、composer.jsonの構文チェックを行います。

php ~/bin/composer validate

構文エラーのままだとcomposerコマンドでエラーが発生します。composer.jsonファイルを編集した場合は必ず実行しましょう。

autoloadの設定手順は以上です。

autoloadで指定する種類

files

"autoload": {
    "files": [
        "src/functions/func1.php",
        "src/const/const1.php",
    ]
}

クラスファイルでない、functionやconstなどを定義した.phpファイルをautoloadします。

結果が保存されるファイル

  • vendor/composer/autoload_files.php

psr-4

"autoload": {
    "psr-4": { "Vendor\\": ["src/Vendor/", "lib/Vendor/"] }
    }
}
"autoload": {
    "psr-4": { "Vendor\\": "src/vendor/" }
}

Laravelなど、psrに準拠したアプリケーション開発で使うパッケージはpsr-4を設定します。

psr-4はnamespaceとディレクトリ構成は一致させる必要があります。そのトップレベルのnamespaceのディレクトリの位置を指定します。[]で括って複数指定することも可能です。

psr-4でnamespaceとディレクトリ構成が一致しない場合、アプリケーション実行時にClass not Foundが発生します。パッケージ自体のエラーは発生しないので、あたかもアプリケーションにバグがあるかのように見えます。
この場合は、autoloadの紐づけ情報が古いか、パッケージのバグの可能性があります
psr-4を設定した場合、あとで説明するpsr-0, classmapの設定は必要ありません。psr-4にはpsr-0, classmapで設定する内容も含まれます。
結果が保存されるファイル

  • vendor/composer/autoload_classmap.php
  • vendor/composer/autoload_namespaces.php
  • vendor/composer/autoload_psr-4.php
  • vendor/composer/autoload_static.php

psr-0

"autoload": {
    "psr-0": {
        "Vendor\\": "src/Vendor/",
        "Vendor\\Namespace\\": "src/Vendor/",
        "Vendor_Namespace_": "src/"
    }
}

psr-2まで準拠するプロジェクトなどで使います。数年前から続いてきた継続プロジェクトなどの古いソースコード以外、使うことはありません。

結果が保存されるファイル

  • vendor/composer/autoload_classmap.php

classmap

"autoload": {
    "classmap": ["src/", "lib/", "Something.php"]
}

classmapとクラスファイルの紐づけを行います。WordPressなどpsrに準拠しない場合に使います。

結果が保存されるファイル

  • vendor/composer/autoload_classmap.php

exclude-from-classmap

"autoload": {
    "exclude-from-classmap": ["/Tests/", "/test/", "/tests/"]
}

autoloadの除外設定を行います。テストクラスなど本番環境では使わないクラスを除外します。

結果が保存されるファイル

  • vendor/composer/autoload_classmap.php

開発環境のautoload

"autoload-dev": {

}

開発環境のautoloadを設定します。

テストクラスなどを指定します。指定するディレクトリはルートディレクトリだけ指定できます。

autoloadの更新

php ~/bin/composer dump-autoload

autoloadのクラスマップの情報を再構築します。"Class not Found"が発生したとき実行します。

dump-autoload -o を使うときは要注意!

php ~/bin/composer dump-autoload -o

オプション-oを付けると、Autoloader Optimizationというautoloadの最適化が行われます。autoloadの速度が速くなります。

しかし注意が必要です。このオプションを付けると、クラスマップ作成するときにpsr-4のルールを無視します。psr-4に準拠しないnamespaceとディレクトリ構成のクラスファイルもクラスマップに登録されるので正常に動作します。

  • 開発環境はオプションなし
  • 本番環境はオプションあり

という使い方をしたほうがよいでしょう。

 

最近Webカテゴリでよく読まれている記事です。
post-cta-image
blog image

ドメイン取得の意味が分からない人へ。王道の方法を紹介します。

ドメインの登録業者を選ぶのに悩む必要はないです。サイトを簡単に早く公開するには全くいらないことで、むしろ邪魔です。『お名前.com』というサービスは必ず耳にします。そのお名前.comのメリットとデメリットと一緒に、ドメインの意味が分からない人が一番失敗しないドメインの取得方法を紹介します。

tadtadya.com

_

SNSでも記事を配信しています。
コメントを残す

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

この記事を気に入ったらぜひシェアも!!