Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
知っておきたいautoloadのはなし - PHPカンファレンス関⻄2024
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Akinori Takigawa
February 10, 2024
2.4k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
知っておきたいautoloadのはなし - PHPカンファレンス関⻄2024
Akinori Takigawa
February 10, 2024
More Decks by Akinori Takigawa
See All by Akinori Takigawa
Nginxになりきって、FCGIでPHPと喋ろう
akinoriakatsuka
0
86
PHPUnitのテストイベントを使ってテストにかかる時間の計測をしよう
akinoriakatsuka
0
150
パイプ演算子の実装を 覗いてみよう
akinoriakatsuka
0
230
PHPでCQRS+ES入門
akinoriakatsuka
0
230
手軽に作れる電卓を作って イベントソーシングに親しもう CQRS+ESカンファレンス2026
akinoriakatsuka
0
910
Rubyで作る物理エンジン - 叡電LT
akinoriakatsuka
0
43
パイプ演算子の実装を覗いてみよう - 【非公式】PHPカンファレンス福岡2025・前日Meetup
akinoriakatsuka
0
50
技術的負債の会計学 - PHPカンファレンス広島2025
akinoriakatsuka
8
1.6k
スクラムをちゃんとやる勇気
akinoriakatsuka
0
71
Featured
See All Featured
Agile that works and the tools we love
rasmusluckow
331
21k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
530
Into the Great Unknown - MozCon
thekraken
41
2.6k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
How Software Deployment tools have changed in the past 20 years
geshan
0
34k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Balancing Empowerment & Direction
lara
6
1.2k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Designing Powerful Visuals for Engaging Learning
tmiket
1
420
RailsConf 2023
tenderlove
30
1.5k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.4k
Transcript
1 / 45 なんで、ファイル名とクラス名を揃えるの? 知っておきたいautoload のはなし PHP カンファレンス関西2024 2024/2/11 赤塚啓紀
2 / 45 自己紹介 名前 赤塚啓紀 所属 株式会社オフショア(神戸の会社) 仕事 医療機関向けの業務支援システムを作っています
X あかつか(@aki_artisan) 趣味 散歩、ハイキング、甘いもの
3 / 45 Target class [...] does not exist. このようなエラーを見たことはないでしょうか?
Laravel で開発していた時の私が遭遇したエラーです。
4 / 45 解決方法 ファイル名とクラス名を揃えるようにしたらうまく動くようになった なんでファイル名とクラス名を揃えると動くようになったのか、よくわから ない 次に同じエラーが出たときにちゃんと治せるか不安 ちゃんと理解しておけば、怖くありません
5 / 45 というわけで本題です。
知っておきたい autoload のはなし
7 / 45 最初に結論から なんでファイル名とクラス名を揃えるの? → autoload のルール (PSR-4) がそうなっているから
8 / 45 🤔
9 / 45 ひとつひとつ説明します。
用語の説明
11 / 45 1. autoload とは 未定義のクラス(インターフェース、トレイトも含む)を呼び出したときに、 PHP が自動的にクラスの定義を書いたファイルを読み込んでくれるしくみ
12 / 45 2. PSR-4 ってなに? autoload のルール PHP-FIG という団体が決めていて、デファクトスタンダード(事実上の標準)
依存関係を管理するcomposer というツールがこのルールを満たすように autoload を実装してくれています ということは、使う時はこのルールを守れば良いということ!
13 / 45 2. PSR-4 ってなに? 具体的には、クラス名(名前空間とクラス名)とファイルパス(ディレクトリ 構成とファイル名)を揃えるということです。 →今はわからなくても大丈夫です!後ほどコードを見ながら説明します。
14 / 45 3. 名前空間ってなに? クラス名の前につけることができる名前のこと クラスの集まり同士を分けるために使う
15 / 45 3. 名前空間ってなに? 同じ名前空間の時 namespace App\Models; $person =
new Person(); 別の名前空間の時 $person = new \App\Models\Person(); namespace App\Models; class Person { // ... }
autoload の使い方をコードで 理解する
17 / 45 フォルダ構成 以下のようなフォルダ構成とします。 . ├── public │ └──
index.php ├── src │ └── Models │ └── Person.php ├── vendor ├── composer.json └── composer.lock
18 / 45 1. 同じファイルにクラスを定義している場合 (autoload を使わない場合) <?php // クラスを使うファイルと同じファイルにクラスを定義している
class Person { public function greet(string $name) : void { echo 'Hello ' . $name . '!'; } } $person = new Person(); $person->greet('Taro'); // Hello Taro!
19 / 45 1. 同じファイルにクラスを定義している場合 (autoload を使わない場合) 実行結果 $ php
public/index.php Hello Taro!
20 / 45 2. require でクラス定義ファイルを読み込む場合 (autoload を使わない場合) src/Models/Person.php <?php
namespace App\Models; class Person { public function greet(string $name) : void { echo 'Hello ' . $name . '!'; } }
21 / 45 2. require でクラス定義ファイルを読み込む場合 (autoload を使わない場合) public/index.php <?php
require_once __DIR__ . '/../src/Models/Person.php'; // 使う側のファイルからクラスの定義が書いてあるファイルを読み込む // 使うファイルを全部読み込む必要がある $person = new App\Models\Person(); $person->greet('Taro'); // Hello Taro! 使うクラスが増えると、require するファイルが増えてしまう
22 / 45 3. autoload を使う場合(composer ) src/Models/Person.php は同じ <?php
namespace App\Models; class Person { public function greet(string $name) : void { echo 'Hello ' . $name . '!'; } }
23 / 45 3. autoload を使う場合(composer ) public/index.php <?php require_once
__DIR__ . '/../vendor/autoload.php'; $person = new App\Models\Person(); $person->greet('Taro');
24 / 45 3. autoload を使う場合(composer ) composer.json に設定を追加します。 (新しい名前空間でオートロードを追加する時のみ)
{ "autoload": { "psr-4": { "App\\": "src/" } } } App という名前空間をsrc ディレクトリに紐づける
25 / 45 3. autoload を使う場合(composer ) この記述を追加した後は、以下のコマンドを実行する必要があります $ composer
dump-autoload ※ 同じディレクトリにある他のクラスが読み込めていたら、composer.json の 設定やcomposer dump-autoload は不要です。 (この辺りはAsk the speaker で聞いてね)
26 / 45 3. autoload を使う場合(composer ) 実行結果 $ php
public/index.php Hello Taro!
27 / 45 3. autoload を使う場合(composer ) ファイルを直接指定していなくてもPerson クラスが読み込めている クラス名で読み込むファイル名が決まるので、ファイル名とクラス名を揃え
る必要がある ここまでが、autoload の動きの部分です。
28 / 45 4. autoload を実現する仕組み 次はこの仕組みをどうやって実現しているのかを見ていきます。
29 / 45 4. autoload を実現する仕組み autoload を使うにはspl_autoload_register という関数を使って、 「クラスが未定義だったらこれをしてね」という処理を登録しておく
これをしておかないとPHP は何をして良いかわからず、結果として「クラス が見つからない」というエラーが出る
30 / 45 4. autoload を実現する仕組み composer を使う場合は、vender/autoload.php や、 vendor/composer/autoload_real.php
にこの処理が書かれている ので、気になったら見てみてください。(私にはちょっと難しかったです。)
autoload を自作する
32 / 45 autoload を自作する せっかくなので、今回はcomposer に頼らず、spl_autoload_register を使 って動きを確かめてみましょう!
33 / 45 spl_autoload_register spl_autoload_register は関数を引数に取る関数 クラスが未定義だったときに実行して欲しい処理を登録できる 登録する関数の引数($class) には、読み込もうとしているクラスの名前空間 付きクラス名が入る(App\Models\Person
) spl_autoload_register(function ($class) { // require_once などでクラスの定義が書いてあるファイルを読み込む処理 });
34 / 45 app/Models/Person.php <?php namespace App\Models; class Person {
public function greet(string $name) : void { echo 'Hello ' . $name . '!' . PHP_EOL; } }
35 / 45 public/index.php <?php require_once __DIR__ . '../lib/autoload.php'; $person
= new App\Models\Person(); $person->greet('Taro');
36 / 45 lib/autoload.php ファイルパスを作って、require_once しているだけ! <?php spl_autoload_register(function ($class) {
$prefix = 'App\\'; // トップレベル名前空間 $base_dir = __DIR__ . '/../src/'; // App に紐づけるディレクトリ $len = strlen($prefix); // トップレベル名前空間の長さ $relative_class = substr($class, $len); // トップレベル名前空間を除いたクラス名 $file = $base_dir . str_replace('\\', '/', $relative_class) . '.php'; require_once $file; });
37 / 45 例:$class = 'App\Models\Person' のとき <?php spl_autoload_register(function ($class)
{ $prefix = 'App\\'; $base_dir = __DIR__ . '/../src/'; $len = strlen($prefix); // 4 $relative_class = substr($class, $len); // Models\Person $file = $base_dir . str_replace('\\', '/', $relative_class) . '.php'; // ../src/Models/Person.php require_once $file; });
38 / 45 autoload を自作する このようにしてspl_autoload_register を使ってautoload を実装できまし た。 ※
実用ではcomposer に頼った方が良いです。
知っておくと嬉しいこと
40 / 45 1. 業務で役立つ エラーが出ても、ちゃんとどうすれば良いかわかった上で対応できるので、 問題解決が早くなる フレームワークのソースコードがどこにあるかわかる
41 / 45 2. 勉強しているときにサクッとautoload をかける 本で勉強してみたいときなど、autoload を正しく設定できると、すぐに本題 に入れるようになる!
42 / 45 まとめ なんでファイル名とクラス名を揃えるの? autoload のルール(PSR-4 )がそうなっているから autoload とは
未定義のクラスを呼び出したときに、PHP が自動的にクラスが定義され ているファイルを読み込んでくれるしくみ autoload を使うには composer を使うのが無難
43 / 45 今日の話はブログにまとめてあるので、 文字で読みたい方はそちらもどうぞ!
44 / 45 Contact Twitter: @aki_artisan GitHub: akinoriakatsuka Ask the
speaker きてね!
ご清聴ありがとうございました