環境
初書:2020/09/03
PC:macOS 10.15.6
Composer: v1.10.10
php 7.4.9
Composerとは
Composerは、PHPプログラミング言語向けのソフトウェアおよび必要なライブラリの依存関係を管理する標準形式を提供するアプリケーションレベルのパッケージ管理システムである。
要するに、ライブラリの依存関係をまとめて処理してくれるものらしい。
逆に、ライブラリを使わないなら必要ないと思われる。(まぁ後に使う可能性があるなら先に用意しておくのもありかもしれない)
インストール
homebrewを使う。
% brew install composer
これだけ。ちなみにローカルとかグローバルとかは今は気にしなくていい(はず)
一応、% composer -v
でバージョン情報が出てくるか確認する。
開発環境に追加する
作成するフォルダ直下に、composer.json
ファイルを作成し、中身にとりあえず
{}
と記述する。(使うライブラリを決めているなら、この時点で記述しておくといいかも。)
次に、ターミナルから下記を実行
% composer install
Loading composer repositories with package information
Updating dependencies (including require-dev)
Nothing to install or update
Generating autoload files
これでvenderフォルダが作成されたはず。
gitから除外する(任意)
vscodeで、gitを使っている場合、基本的に全てのファイル/フォルダがgitの対象になってしまい、うざいので除外していく。
まず、composer.jsonと同じ階層に.gitignore
ファイルを作成する
このファイルに、gitから除外するファイル名等を記述する。
今回はvenderフォルダを除外したいので、
vendor
.gitignore
を記述する(.gitignoreもgitから除外してもいいよね?)
完成
これで、準備は完了。あとはphpファイルで
require __DIR__ . '/vendor/autoload.php';
を読み込むだけで、ライブラリを使う事ができる。
.
と、まぁここまで書いたのはいいが、今のところ見た感じライブラリを使わない場合は全くもって必要がない。
ここで、composerのもう一つの役割を持ってくる。
それは、必要な時に必要な物だけ読み込んでくれるシステムである。
phpにはautoloadという機能があり、呼ばれたクラスが読み込まれていなかったらそれを読み込む。という機能がある。1
これをcomposerがまとめて処理してくれるので、ライブラリの依存関係とかを処理できるらしい。
なので、自分が作ったクラスをcomposerに取り入れて、それを適当なタイミングで読み込んでもらえるように設定してみる。
クラスの用意
とりあえず説明するためのクラスがなければ話が進まないので、適当にクラスを用意する。
<?php
namespace tes;
class ShowText
{
public function EchoText(string $str) : void
{
echo htmlspecialchars($str);
}
}
エスケープ処理して出力する関数があるクラス。
これを、phpフォルダを作成し、用意する。
.
├── composer.json
├── vendor
│ ├── autoload.php
│ └── (その他フォルダ)
└── php
└── ShowText.php
今こういう感じ。
composerに追加する
composer.jsonに下記を追加する。
(json内部が空の場合は以下コピペ。書いている場合はrequireとかと同じ位置)
{
"autoload": {
"psr-4": {
"tes\\": "php"
}
}
}
ちなみに、psr-4という記述方式を利用するため、keyがnamespace(+\\)、valueが該当ファイルまでのフォルダ構造、そしてクラス名とファイル名は同じでなくてはならない。らしい。
書き終えたら、
% composer dump-autoload
を実行し、autoloaderに認識してもらう。
実行してみる
<?php
declare(strict_types=1);
require_once __DIR__ . "/vendor/autoload.php";
$a = new tes\ShowText();
$a->EchoText("テスト表示");
テスト表示
クラス宣言が長いと感じる時は、useを使うことも可能。
<?php
declare(strict_types=1);
use tes\ShowText;
require_once __DIR__ . "/vendor/autoload.php";
$a = new ShowText();
$a->EchoText("テスト表示");
このように、autoloadの前にuseを記述しても、ShowTextファイルが読み込まれるのはnew ShowTextの箇所なので、useを使っても特に問題はなさそう。
終わりに
せっかくなのでライブラリをいくつか探してみようかな。。
参考サイト
Composerの使い方
Visual studio codeで.vscodeディレクトリをgit管理から外す
自作のクラスを`composer`の`autoload`で自動読み込みする