環境
Docker の PHP 上で試しました。
- OS バージョン
cat /etc/issue: Debian GNU/Linux 9 \n \lcat /etc/debian_version: 9.5
- PHP バージョン
php -v:
PHP 7.2.9 (cli) (built: Aug 22 2018 23:59:10) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
root@794dbcc792c6:~# cat /etc/issue
# Docker で PHP に入る docker run -it --rm php bash # OS バージョン cat /etc/issue cat /etc/debian_version # PHP バージョン php -v
入門の実践。これだけ打てば体験できる、コマンドまとめ
docker run -it --rm php bash してコンテナの中に入ってからスタートです。
# 適当なディレクトリを作成し、その場所に移動
mkdir ~/testcomposer
cd ~/testcomposer/
# Composer インストール
curl -sS https://getcomposer.org/installer | php
# インストール確認
php composer.phar
# オートロード (Composer プロジェクト) に必要なファイルの作成
cat << 'EOF' > composer.json
{
"autoload": {
"psr-4": {
"myapp\\": "src/"
}
}
}
EOF
# オートロードの準備 (Composer プロジェクトのインストール)
# composer.json ファイルの変更をしたら composer update
# autoload の変更のみなら composer dumpautoload で反映可
php composer.phar install
# オートロードを体験するための PHP ファイル作成
cat << 'EOF' > App.php
<?php
require_once "vendor/autoload.php";
use myapp\domain\User;
use myapp\domain\equipment\Weapon;
$weapon1 = new Weapon('sword');
$user1 = new User('user1', $weapon1);
echo $user1->hello();
echo "\n";
echo $user1->attack();
echo "\n";
EOF
mkdir -p src/domain/equipment/
cat << 'EOF' > src/domain/User.php
<?php
namespace myapp\domain;
use myapp\domain\equipment\Weapon;
Class User {
private $user_name;
private $weapon;
public function __construct($user_name, $weapon) {
$this->user_name = $user_name;
$this->weapon = $weapon;
}
public function hello() {
return "{$this->user_name} says hello!";
}
public function attack() {
return "{$this->user_name} attacked with {$this->weapon->weapon_name()}!";
}
}
EOF
cat << 'EOF' > src/domain/equipment/Weapon.php
<?php
namespace myapp\domain\equipment;
Class Weapon {
private $weapon_name;
public function __construct($weapon_name) {
$this->weapon_name = $weapon_name;
}
public function weapon_name() {
return $this->weapon_name;
}
}
EOF
# オートロードを試す
# user1 says hello!
# user1 attacked with sword! と出力されれば成功
php App.php
もしオートロードがなかったら
<?php
require_once "src/domain/User.php";
require_once "src/domain/equipment/Weapon.php";
use myapp\domain\User;
use myapp\domain\equipment\Weapon;
$weapon1 = new Weapon('sword');
$user1 = new User('user1', $weapon1);
echo $user1->hello();
echo "\n";
echo $user1->attack();
echo "\n";
今回のサンプルでは、App.php の 2 ~ 3 行目の require_once の内容が異なるだけです。
したがってオートロードのありがたみを実感し辛いですけれども、さらにクラスファイルが増えた場合、オートロードがない場合はその都度必要なクラスに必要な文だけ require_once を追加していく必要があります。
App.php だけでなく、User.php に必要になるかも知れませんし、もっと別のクラスに必要となるかも知れません。これは、面倒で、管理が厄介です。
オートロードがある場合は、App.php の require_once のみあれば、App.php にも、User.php にも、他の src ディレクトリ配下のクラスにも、require_once は不要です (の、ハズです)。楽です♪
おわりに
非常に久しぶりに PHP を触りました。全部忘れていますね><。
復習がてら、オートロードについて、オートロードだけを導入する体験を、まとめました。
次のページが参考になりました、ありがとうございます!
- Composer ドキュメント日本語訳
- 本投稿はこのページをベースに、自分なりに試行錯誤しました♪
- PHP のオートロードは名前空間と切っても切れない関係にあることも学びました。その名前空間について、学べるページ♪
- オートロードするときに、psr-0 または psr-4 が指定できますが、0 は非推奨なので、psr-4 を使います。
- 直接本当ことは関係ありませんが、PHP リハビリのために、つまみ読みしたページ
以上です。
