Slide 1

Slide 1 text

1 / 45 なんで、ファイル名とクラス名を揃えるの? 知っておきたいautoload のはなし PHP カンファレンス関西2024 2024/2/11 赤塚啓紀

Slide 2

Slide 2 text

2 / 45 自己紹介 名前 赤塚啓紀 所属 株式会社オフショア(神戸の会社) 仕事 医療機関向けの業務支援システムを作っています X あかつか(@aki_artisan) 趣味 散歩、ハイキング、甘いもの

Slide 3

Slide 3 text

3 / 45 Target class [...] does not exist. このようなエラーを見たことはないでしょうか? Laravel で開発していた時の私が遭遇したエラーです。

Slide 4

Slide 4 text

4 / 45 解決方法 ファイル名とクラス名を揃えるようにしたらうまく動くようになった なんでファイル名とクラス名を揃えると動くようになったのか、よくわから ない 次に同じエラーが出たときにちゃんと治せるか不安 ちゃんと理解しておけば、怖くありません

Slide 5

Slide 5 text

5 / 45 というわけで本題です。

Slide 6

Slide 6 text

知っておきたい autoload のはなし

Slide 7

Slide 7 text

7 / 45 最初に結論から なんでファイル名とクラス名を揃えるの? → autoload のルール (PSR-4) がそうなっているから

Slide 8

Slide 8 text

8 / 45 🤔

Slide 9

Slide 9 text

9 / 45 ひとつひとつ説明します。

Slide 10

Slide 10 text

用語の説明

Slide 11

Slide 11 text

11 / 45 1. autoload とは 未定義のクラス(インターフェース、トレイトも含む)を呼び出したときに、 PHP が自動的にクラスの定義を書いたファイルを読み込んでくれるしくみ

Slide 12

Slide 12 text

12 / 45 2. PSR-4 ってなに? autoload のルール PHP-FIG という団体が決めていて、デファクトスタンダード(事実上の標準) 依存関係を管理するcomposer というツールがこのルールを満たすように autoload を実装してくれています ということは、使う時はこのルールを守れば良いということ!

Slide 13

Slide 13 text

13 / 45 2. PSR-4 ってなに? 具体的には、クラス名(名前空間とクラス名)とファイルパス(ディレクトリ 構成とファイル名)を揃えるということです。 →今はわからなくても大丈夫です!後ほどコードを見ながら説明します。

Slide 14

Slide 14 text

14 / 45 3. 名前空間ってなに? クラス名の前につけることができる名前のこと クラスの集まり同士を分けるために使う

Slide 15

Slide 15 text

15 / 45 3. 名前空間ってなに? 同じ名前空間の時 namespace App\Models; $person = new Person(); 別の名前空間の時 $person = new \App\Models\Person(); namespace App\Models; class Person { // ... }

Slide 16

Slide 16 text

autoload の使い方をコードで 理解する

Slide 17

Slide 17 text

17 / 45 フォルダ構成 以下のようなフォルダ構成とします。 . ├── public │ └── index.php ├── src │ └── Models │ └── Person.php ├── vendor ├── composer.json └── composer.lock

Slide 18

Slide 18 text

18 / 45 1. 同じファイルにクラスを定義している場合 (autoload を使わない場合) greet('Taro'); // Hello Taro!

Slide 19

Slide 19 text

19 / 45 1. 同じファイルにクラスを定義している場合 (autoload を使わない場合) 実行結果 $ php public/index.php Hello Taro!

Slide 20

Slide 20 text

20 / 45 2. require でクラス定義ファイルを読み込む場合 (autoload を使わない場合) src/Models/Person.php

Slide 21

Slide 21 text

21 / 45 2. require でクラス定義ファイルを読み込む場合 (autoload を使わない場合) public/index.php greet('Taro'); // Hello Taro! 使うクラスが増えると、require するファイルが増えてしまう

Slide 22

Slide 22 text

22 / 45 3. autoload を使う場合(composer ) src/Models/Person.php は同じ

Slide 23

Slide 23 text

23 / 45 3. autoload を使う場合(composer ) public/index.php greet('Taro');

Slide 24

Slide 24 text

24 / 45 3. autoload を使う場合(composer ) composer.json に設定を追加します。 (新しい名前空間でオートロードを追加する時のみ) { "autoload": { "psr-4": { "App\\": "src/" } } } App という名前空間をsrc ディレクトリに紐づける

Slide 25

Slide 25 text

25 / 45 3. autoload を使う場合(composer ) この記述を追加した後は、以下のコマンドを実行する必要があります $ composer dump-autoload ※ 同じディレクトリにある他のクラスが読み込めていたら、composer.json の 設定やcomposer dump-autoload は不要です。 (この辺りはAsk the speaker で聞いてね)

Slide 26

Slide 26 text

26 / 45 3. autoload を使う場合(composer ) 実行結果 $ php public/index.php Hello Taro!

Slide 27

Slide 27 text

27 / 45 3. autoload を使う場合(composer ) ファイルを直接指定していなくてもPerson クラスが読み込めている クラス名で読み込むファイル名が決まるので、ファイル名とクラス名を揃え る必要がある ここまでが、autoload の動きの部分です。

Slide 28

Slide 28 text

28 / 45 4. autoload を実現する仕組み 次はこの仕組みをどうやって実現しているのかを見ていきます。

Slide 29

Slide 29 text

29 / 45 4. autoload を実現する仕組み autoload を使うにはspl_autoload_register という関数を使って、 「クラスが未定義だったらこれをしてね」という処理を登録しておく これをしておかないとPHP は何をして良いかわからず、結果として「クラス が見つからない」というエラーが出る

Slide 30

Slide 30 text

30 / 45 4. autoload を実現する仕組み composer を使う場合は、vender/autoload.php や、 vendor/composer/autoload_real.php にこの処理が書かれている ので、気になったら見てみてください。(私にはちょっと難しかったです。)

Slide 31

Slide 31 text

autoload を自作する

Slide 32

Slide 32 text

32 / 45 autoload を自作する せっかくなので、今回はcomposer に頼らず、spl_autoload_register を使 って動きを確かめてみましょう!

Slide 33

Slide 33 text

33 / 45 spl_autoload_register spl_autoload_register は関数を引数に取る関数 クラスが未定義だったときに実行して欲しい処理を登録できる 登録する関数の引数($class) には、読み込もうとしているクラスの名前空間 付きクラス名が入る(App\Models\Person ) spl_autoload_register(function ($class) { // require_once などでクラスの定義が書いてあるファイルを読み込む処理 });

Slide 34

Slide 34 text

34 / 45 app/Models/Person.php

Slide 35

Slide 35 text

35 / 45 public/index.php greet('Taro');

Slide 36

Slide 36 text

36 / 45 lib/autoload.php ファイルパスを作って、require_once しているだけ!

Slide 37

Slide 37 text

37 / 45 例:$class = 'App\Models\Person' のとき

Slide 38

Slide 38 text

38 / 45 autoload を自作する このようにしてspl_autoload_register を使ってautoload を実装できまし た。 ※ 実用ではcomposer に頼った方が良いです。

Slide 39

Slide 39 text

知っておくと嬉しいこと

Slide 40

Slide 40 text

40 / 45 1. 業務で役立つ エラーが出ても、ちゃんとどうすれば良いかわかった上で対応できるので、 問題解決が早くなる フレームワークのソースコードがどこにあるかわかる

Slide 41

Slide 41 text

41 / 45 2. 勉強しているときにサクッとautoload をかける 本で勉強してみたいときなど、autoload を正しく設定できると、すぐに本題 に入れるようになる!

Slide 42

Slide 42 text

42 / 45 まとめ なんでファイル名とクラス名を揃えるの? autoload のルール(PSR-4 )がそうなっているから autoload とは 未定義のクラスを呼び出したときに、PHP が自動的にクラスが定義され ているファイルを読み込んでくれるしくみ autoload を使うには composer を使うのが無難

Slide 43

Slide 43 text

43 / 45 今日の話はブログにまとめてあるので、 文字で読みたい方はそちらもどうぞ!

Slide 44

Slide 44 text

44 / 45 Contact Twitter: @aki_artisan GitHub: akinoriakatsuka Ask the speaker きてね!

Slide 45

Slide 45 text

ご清聴ありがとうございました