Slide 1

Slide 1 text

ファイル先頭の use の意味、 説明できますか? 〜PHP の namespace とautoloading の 関係を正しく理解しよう〜 2024/03/09 PHPerKaigi 2024 @okashoi

Slide 2

Slide 2 text

発表時には「use 演算子」と表現していましたが、 use は演算子ではなく文であるという旨のフィードバック をいただいたためスライドを修正しました。 2024/03/10 追記

Slide 3

Slide 3 text

1. はじめに 00:00~02:00 2. use 文とは 02:00~08:00 3. なぜ他ファイルを読み込めるのか 08:00~11:30 4. どうファイル名が解決されるのか 11:30~17:00 5. まとめ 17:00~19:00 6. 自己紹介 19:00~20:00 目次(※時間は目安)

Slide 4

Slide 4 text

1. はじめに 00:00~02:00 2. use 文とは 02:00~08:00 3. なぜ他ファイルを読み込めるのか 08:00~11:30 4. どうファイル名が解決されるのか 11:30~17:00 5. まとめ 17:00~19:00 6. 自己紹介 19:00~20:00 目次(※時間は目安)

Slide 5

Slide 5 text

フレームワークを使っていると遭遇するコード use App\Models\Flight; // Retrieve a model by its primary key... $flight = Flight::find(1); // Retrieve the first model matching the query constraints... $flight = Flight::where('active', 1)->first(); // Alternative to retrieving the first model matching the query constraints... $flight = Flight::firstWhere('active', 1); 引用元:https://laravel.com/docs/10.x/eloquent#retrieving-single-models

Slide 6

Slide 6 text

説明できますか? use App\Models\Flight; // Retrieve a model by its primary key... $flight = Flight::find(1); // Retrieve the first model matching the query constraints... $flight = Flight::where('active', 1)->first(); // Alternative to retrieving the first model matching the query constraints... $flight = Flight::firstWhere('active', 1); 引用元:https://laravel.com/docs/10.x/eloquent#retrieving-single-models

Slide 7

Slide 7 text

「use って書いたら  指定したファイルの内容を  読み込んでくれるんでしょ?」

Slide 8

Slide 8 text

「use って書いたら  指定したファイルの内容を  読み込んでくれるんでしょ?」

Slide 9

Slide 9 text

1. はじめに 00:00~02:00 2. use 文とは 02:00~08:00 3. なぜ他ファイルを読み込めるのか 08:00~11:30 4. どうファイル名が解決されるのか 11:30~17:00 5. まとめ 17:00~19:00 6. 自己紹介 19:00~20:00 目次(※時間は目安)

Slide 10

Slide 10 text

そもそもこれはファイル名ではない use App\Models\Flight; // Retrieve a model by its primary key... $flight = Flight::find(1); // Retrieve the first model matching the query constraints... $flight = Flight::where('active', 1)->first(); // Alternative to retrieving the first model matching the query constraints... $flight = Flight::firstWhere('active', 1); 引用元:https://laravel.com/docs/10.x/eloquent#retrieving-single-models

Slide 11

Slide 11 text

Slide 12

Slide 12 text

本来、ファイルパスとは独立した概念 1 ファイル内で複数の名前空間を使うことができる 名前空間の使い方

Slide 13

Slide 13 text

Slide 14

Slide 14 text

Slide 15

Slide 15 text

Slide 16

Slide 16 text

use 文に関する PHP 公式ドキュメント https://www.php.net/manual/ja/language.namespaces.importing.php

Slide 17

Slide 17 text

use 文に関する PHP 公式ドキュメント https://www.php.net/manual/ja/language.namespaces.importing.php “PHP は定数、関数、クラス、インターフェイス、トレイト、列挙型 (Enum)、名前空間のエイリアスやインポートをサポートしています。 エイリアス作成には use 演算子を使用します。” (注)「use 演算子」という表現はドキュメント原文まま

Slide 18

Slide 18 text

use 文に関する PHP 公式ドキュメント https://www.php.net/manual/ja/language.namespaces.importing.php “PHP は定数、関数、クラス、インターフェイス、トレイト、列挙型 (Enum)、名前空間のエイリアスやインポートをサポートしています。 エイリアス作成には use 演算子を使用します。” (注)「use 演算子」という表現はドキュメント原文まま

Slide 19

Slide 19 text

use 文に関する PHP 公式ドキュメント https://www.php.net/manual/ja/language.namespaces.importing.php

Slide 20

Slide 20 text

Flight → App\Models\Flight というエイリアス use App\Models\Flight; // Retrieve a model by its primary key... $flight = Flight::find(1); // Retrieve the first model matching the query constraints... $flight = Flight::where('active', 1)->first(); // Alternative to retrieving the first model matching the query constraints... $flight = Flight::firstWhere('active', 1); 引用元:https://laravel.com/docs/10.x/eloquent#retrieving-single-models

Slide 21

Slide 21 text

Flight → App\Models\Flight というエイリアス use App\Models\Flight as Flight; // Retrieve a model by its primary key... $flight = Flight::find(1); // Retrieve the first model matching the query constraints... $flight = Flight::where('active', 1)->first(); // Alternative to retrieving the first model matching the query constraints... $flight = Flight::firstWhere('active', 1);

Slide 22

Slide 22 text

つまりこのコードは use App\Models\Flight as Flight; // Retrieve a model by its primary key... $flight = Flight::find(1); // Retrieve the first model matching the query constraints... $flight = Flight::where('active', 1)->first(); // Alternative to retrieving the first model matching the query constraints... $flight = Flight::firstWhere('active', 1);

Slide 23

Slide 23 text

こう書いているのと同じ // Retrieve a model by its primary key... $flight = \App\Models\Flight::find(1); // Retrieve the first model matching the query constraints... $flight = \App\Models\Flight::where('active', 1)->first(); // Alternative to retrieving the first model matching the query constraints... $flight = \App\Models\Flight::firstWhere('active', 1);

Slide 24

Slide 24 text

use 文によって簡潔に書ける use App\Models\Flight; // Retrieve a model by its primary key... $flight = Flight::find(1); // Retrieve the first model matching the query constraints... $flight = Flight::where('active', 1)->first(); // Alternative to retrieving the first model matching the query constraints... $flight = Flight::firstWhere('active', 1); 引用元:https://laravel.com/docs/10.x/eloquent#retrieving-single-models

Slide 25

Slide 25 text

• use 文に与えているのはファイルパスではない • 名前空間 + クラス名 • 本来、名前空間とファイルパスは独立した概念 • use 文によってエイリアスが作成できる use 文 まとめ

Slide 26

Slide 26 text

1. はじめに 00:00~02:00 2. use 文とは 02:00~08:00 3. なぜ他ファイルを読み込めるのか 08:00~11:30 4. どうファイル名が解決されるのか 11:30~17:00 5. まとめ 17:00~19:00 6. 自己紹介 19:00~20:00 目次(※時間は目安)

Slide 27

Slide 27 text

(再掲)そもそもこれはファイル名ではない use App\Models\Flight; // Retrieve a model by its primary key... $flight = Flight::find(1); // Retrieve the first model matching the query constraints... $flight = Flight::where('active', 1)->first(); // Alternative to retrieving the first model matching the query constraints... $flight = Flight::firstWhere('active', 1); 引用元:https://laravel.com/docs/10.x/eloquent#retrieving-single-models

Slide 28

Slide 28 text

「じゃあどうやって他のファイルの  定義にアクセスしてるの?」

Slide 29

Slide 29 text

https://getcomposer.org/

Slide 30

Slide 30 text

Composer が自動読み込み機能を提供している https://getcomposer.org/doc/01-basic-usage.md#autoloading

Slide 31

Slide 31 text

Composer が自動読み込み機能を提供している https://getcomposer.org/doc/01-basic-usage.md#autoloading

Slide 32

Slide 32 text

「そんなの書いた覚えないよ」

Slide 33

Slide 33 text

フレームワークの処理の起点は index.php https://speakerdeck.com/okashoi/index-dot-php-of-each-framework

Slide 34

Slide 34 text

例)Laravel の public/index.php https://github.com/laravel/laravel/blob/1a4d1dc81f7924259885250d011ffad2472 8cd86/public/index.php#L34

Slide 35

Slide 35 text

例)Laravel の public/index.php https://github.com/laravel/laravel/blob/1a4d1dc81f7924259885250d011ffad2472 8cd86/public/index.php#L34

Slide 36

Slide 36 text

例)CakePHP の webroot/index.php https://github.com/cakephp/app/blob/b335138cf00827894131de289f2cd3b69024 2bd1/webroot/index.php#L28

Slide 37

Slide 37 text

例)CakePHP の webroot/index.php https://github.com/cakephp/app/blob/b335138cf00827894131de289f2cd3b69024 2bd1/webroot/index.php#L28

Slide 38

Slide 38 text

• ファイルの自動読み込みは Composer が提供してくれ ている • vendor/autoload.php だけを読み込めばよい • フレームワークでは index.php にて vendor/autoload.php が読み込まれている なぜ他ファイルを読み込めるのか まとめ

Slide 39

Slide 39 text

休憩(ここで水をのむ)

Slide 40

Slide 40 text

1. はじめに 00:00~02:00 2. use 文とは 02:00~08:00 3. なぜ他ファイルを読み込めるのか 08:00~11:30 4. どうファイル名が解決されるのか 11:30~17:00 5. まとめ 17:00~19:00 6. 自己紹介 19:00~20:00 目次(※時間は目安)

Slide 41

Slide 41 text

「名前空間だけで対象のファイルを  どうやって見つけてるの?」

Slide 42

Slide 42 text

https://www.php-fig.org/psr/

Slide 43

Slide 43 text

https://www.php-fig.org/psr/psr-4/ PSR-4 にて autoloading の仕様が定義されている ※ PSR それ自体は「仕様(≒文書)」であり、ライブラリなどではない

Slide 44

Slide 44 text

https://www.php-fig.org/psr/psr-4/ PSR-4 にて autoloading の仕様が定義されている

Slide 45

Slide 45 text

https://www.php-fig.org/psr/psr-4/ PSR-4 にて autoloading の仕様が定義されている

Slide 46

Slide 46 text

PSR-4 にて autoloading の仕様が定義されている https://www.php-fig.org/psr/psr-4/

Slide 47

Slide 47 text

https://www.php-fig.org/psr/psr-4/ PSR-4 にて autoloading の仕様が定義されている

Slide 48

Slide 48 text

https://www.php-fig.org/psr/psr-4/ PSR-4 にて autoloading の仕様が定義されている + = + = + = + =

Slide 49

Slide 49 text

PSR-4 にて autoloading の仕様が定義されている https://www.php-fig.org/psr/psr-4/

Slide 50

Slide 50 text

https://www.php-fig.org/psr/psr-4/ PSR-4 にて autoloading の仕様が定義されている

Slide 51

Slide 51 text

PSR-4 にて autoloading の仕様が定義されている https://www.php-fig.org/psr/psr-4/ + = + + = = + =

Slide 52

Slide 52 text

https://getcomposer.org/doc/04-schema.md#psr-4 Composer が PSR-4 形式をサポートしている

Slide 53

Slide 53 text

https://getcomposer.org/doc/04-schema.md#psr-4 Composer が PSR-4 形式をサポートしている namespace prefix base directory

Slide 54

Slide 54 text

例)Laravel の composer.json https://github.com/laravel/laravel/blob/1a4d1dc81f7924259885250d011ffad2472 8cd86/composer.json#L23-L34

Slide 55

Slide 55 text

Slide 56

Slide 56 text

Slide 57

Slide 57 text

Slide 58

Slide 58 text

Slide 59

Slide 59 text

例)CakePHP の composer.json https://github.com/cakephp/app/blob/b335138cf00827894131de289f2cd3b69024 2bd1/composer.json#L27-L37

Slide 60

Slide 60 text

• PHP-FIG という団体が PSR(PHP Standard Recommendation)を策定している • PSR-4 にて autoloading の仕様が定義されている • namespace prefix と base directory • Composer が PSR-4 にもとづく autoloading をサポー ト(実装)している どうファイル名が解決されるのか まとめ

Slide 61

Slide 61 text

1. はじめに 00:00~02:00 2. use 文とは 02:00~08:00 3. なぜ他ファイルを読み込めるのか 08:00~11:30 4. どうファイル名が解決されるのか 11:30~17:00 5. まとめ 17:00~19:00 6. 自己紹介 19:00~20:00 目次(※時間は目安)

Slide 62

Slide 62 text

まとめ ● autoloading 機能を提供 ● autoloading の 1 つの方法として PSR-4 をサポート ● PSR-4 の仕様を策定 (ファイル名と名前空間の対応) ● 言語機能としての名前空間 ● use 文による名前空間の エイリアス

Slide 63

Slide 63 text

まとめ ● autoloading 機能を提供 ● autoloading の 1 つの方法として PSR-4 をサポート ● PSR-4 の仕様を策定 (ファイル名と名前空間の対応) ● 言語機能としての名前空間 ● use 文による名前空間の エイリアス

Slide 64

Slide 64 text

まとめ ● autoloading 機能を提供 ● autoloading の 1 つの方法として PSR-4 をサポート ● PSR-4 の仕様を策定 (ファイル名と名前空間の対応) ● 言語機能としての名前空間 ● use 文による名前空間の エイリアス

Slide 65

Slide 65 text

• use 文には他のファイルを読み込む働きはない • PSR-4 という autoloading についての仕様が 定められている • Composer は PSR-4 をサポート(実装)している • 各種フレームワークはインストールした時点で そのあたりの設定がすでに書かれている 全体 まとめ

Slide 66

Slide 66 text

1. はじめに 00:00~02:00 2. use 文とは 02:00~08:00 3. なぜ他ファイルを読み込めるのか 08:00~11:30 4. どうファイル名が解決されるのか 11:30~17:00 5. まとめ 17:00~19:00 6. 自己紹介 19:00~20:00 目次(※時間は目安)

Slide 67

Slide 67 text

所属:株式会社ウィルゲート 登壇: 寄稿: 岡田 正平/おかしょい X: @okashoi GitHub: @okashoi PHPerKaigi 2024 シルバースポンサー

Slide 68

Slide 68 text

No content

Slide 69

Slide 69 text

時間あまったら話すやつ

Slide 70

Slide 70 text

use 文について余談

Slide 71

Slide 71 text

余談 use App\Models\Flight as Flight; // Retrieve a model by its primary key... $flight = Flight::find(1); // Retrieve the first model matching the query constraints... $flight = Flight::where('active', 1)->first(); // Alternative to retrieving the first model matching the query constraints... $flight = Flight::firstWhere('active', 1); 引用元:https://laravel.com/docs/10.x/eloquent#retrieving-single-models

Slide 72

Slide 72 text

こう書いても同じだし use App\Models\Flight as FlightModel; // Retrieve a model by its primary key... $flight = FlightModel::find(1); // Retrieve the first model matching the query constraints... $flight = FlightModel::where('active', 1)->first(); // Alternative to retrieving the first model matching the query constraints... $flight = FlightModel::firstWhere('active', 1); 引用元:https://laravel.com/docs/10.x/eloquent#retrieving-single-models

Slide 73

Slide 73 text

あるいは use App\Models\Flight as Flight; // Retrieve a model by its primary key... $flight = Flight::find(1); // Retrieve the first model matching the query constraints... $flight = Flight::where('active', 1)->first(); // Alternative to retrieving the first model matching the query constraints... $flight = Flight::firstWhere('active', 1); 引用元:https://laravel.com/docs/10.x/eloquent#retrieving-single-models

Slide 74

Slide 74 text

こういう書き方もできる use App\Models; // Retrieve a model by its primary key... $flight = Models\Flight::find(1); // Retrieve the first model matching the query constraints... $flight = Models\Flight::where('active', 1)->first(); // Alternative to retrieving the first model matching the query constraints... $flight = Models\Flight::firstWhere('active', 1); 引用元:https://laravel.com/docs/10.x/eloquent#retrieving-single-models