Slide 1

Slide 1 text

PSRで世界が変わる 2019.9.28 技術い勉強会 @tsyama

Slide 2

Slide 2 text

@tsyama_desu 自己紹介 @tsyama

Slide 3

Slide 3 text

PSRとは?

Slide 4

Slide 4 text

PHP Standards Recommendations (PHP標準勧告)

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

- PHP-FIGという団体が作成 - 「PHP書くときのルール決めてみたんだけど」 - 現在PSR-0からPSR-19まである - 既存のものは三種に大別できる

Slide 7

Slide 7 text

- PHP-FIGという団体が作成 - 「PHP書くときのルール決めてみたんだけど」 - 現在PSR-0からPSR-19まである - 既存のものは三種に大別できる

Slide 8

Slide 8 text

1. コーディングスタイル 2. オートローディング規約 3. インターフェース よくわかるPSRのすべて

Slide 9

Slide 9 text

1. コーディングスタイル 2. オートローディング規約 3. インターフェース よくわかるPSRのすべて

Slide 10

Slide 10 text

- PSR-1 - PSR-2 (ABANDONED) - PSR-12 1. コーディングスタイル

Slide 11

Slide 11 text

PSR-1 基本コーディング規約 - ファイルは `

Slide 12

Slide 12 text

- インデントには、Tabではなく4 Spaceを使用する - 関数やクラス定義の `{` や `}` を独立した行にする - コンマの前にSpaceを入れず、後に1 Spaceを入れる … PSR-2 コーディングスタイルガイド

Slide 13

Slide 13 text

public function hoge () { $hoge = “hoge”; echo $hoge; return $hoge; } PSR-2 コーディングスタイルガイド

Slide 14

Slide 14 text

public function hoge () { $hoge = “hoge”; echo $hoge; return $hoge; } PSR-2 コーディングスタイルガイド

Slide 15

Slide 15 text

ABANDONED (放棄)

Slide 16

Slide 16 text

- プロパティ/メソッドのアクセス修飾子は必ず明記する - スカラータイプヒンティングは小文字で書く - 無名クラスの書き方とか … PSR-12 拡張コーディングスタイルガイド 新たにPHP7向けに対応したコーディングスタイルガイド

Slide 17

Slide 17 text

これを受けて我々はどうするべきか

Slide 18

Slide 18 text

PSR-12 拡張コーディングスタイルガイド PSR-2と同様に、この仕様の目的は、さまざまな著者のコードを 認知摩耗を減らすことです。… したがって、このガイドの利点はルール自体ではなく、それらの ルールの共有にあります。 PSR-12 Overviewより引用(翻訳)

Slide 19

Slide 19 text

PSR-12 拡張コーディングスタイルガイド PSR-2と同様に、この仕様の目的は、さまざまな著者のコードを 認知摩耗を減らすことです。… したがって、このガイドの利点はルール自体ではなく、それらの ルールの共有にあります。 PSR-12 Overviewより引用(翻訳)

Slide 20

Slide 20 text

PSR-12 拡張コーディングスタイルガイド 「このコーディングスタイルガイドを厳守しろ」 と言っているわけではない

Slide 21

Slide 21 text

PSR-12 拡張コーディングスタイルガイド プロジェクト内でコーディングスタイルを 統一するということが何よりも重要 (PHPだけじゃない!)

Slide 22

Slide 22 text

PSR-12 拡張コーディングスタイルガイド コーディングスタイルを統一しないと起こること - Gitに余計な差分ができる - 見た目に統一感がなく、汚い - 争いが生まれる

Slide 23

Slide 23 text

PSR-12 拡張コーディングスタイルガイド コーディングスタイル、統一しましょう

Slide 24

Slide 24 text

1. コーディングスタイル 2. オートローディング規約 3. インターフェース よくわかるPSRのすべて

Slide 25

Slide 25 text

- PSR-0 (DEPRECATED) - PSR-4 2. オートローディング規約

Slide 26

Slide 26 text

2. オートローディング規約 オートローディングとは?

Slide 27

Slide 27 text

2. オートローディング規約 ライブラリを使いやすくする仕組み

Slide 28

Slide 28 text

2. オートローディング規約

Slide 29

Slide 29 text

2. オートローディング規約 オートローディングの仕組みを活用して PHPライブラリの管理を担う (npmとかと同じようなもの)

Slide 30

Slide 30 text

2. オートローディング規約 どうやって?

Slide 31

Slide 31 text

PSR-4 オートローダ - ライブラリファイルの置き場とそれに対応する クラス名を定義している

Slide 32

Slide 32 text

2. オートローディング規約 vendor

Slide 33

Slide 33 text

2. オートローディング規約 use \Hoge\Huga

Slide 34

Slide 34 text

2. オートローディング規約 require_once(‘../../../hoge/huga.php’)

Slide 35

Slide 35 text

2. オートローディング規約 require_once(‘../../../hoge/huga.php’)

Slide 36

Slide 36 text

2. オートローディング規約 composerで世界はどう変わったか

Slide 37

Slide 37 text

2. オートローディング規約 ライブラリ同士が 依存し、依存されやすい世界に

Slide 38

Slide 38 text

2. オートローディング規約 例えばLaravel

Slide 39

Slide 39 text

2. オートローディング規約 - doctrine/inflector - dragonmantank/cron-expression - egulias/email-validator - erusev/parsedown - league/flysystem - monolog/monolog - nesbot/carbon - opis/closure - psr/container - psr/simple-cache - ramsey/uuid - swiftmailer/swiftmailer - symfony/console - symfony/debug - symfony/finder - symfony/http-foundation - symfony/http-kernel - symfony/process - symfony/routing - symfony/var-dumper - tijsverkoyen/css-to-inline-styles - vlucas/phpdotenv

Slide 40

Slide 40 text

2. オートローディング規約 ライブラリ同士が互いに助け合う 生態系がPHPの中に生まれた

Slide 41

Slide 41 text

2. オートローディング規約 エコシステム

Slide 42

Slide 42 text

2. オートローディング規約 ちなみに

Slide 43

Slide 43 text

2. オートローディング規約 エコシステムを体感するの めっちゃ大事

Slide 44

Slide 44 text

2. オートローディング規約

Slide 45

Slide 45 text

2. オートローディング規約 世界のプログラマの生態系の中に 組み込まれている…!

Slide 46

Slide 46 text

2. オートローディング規約 うれしい

Slide 47

Slide 47 text

2. オートローディング規約 楽しい

Slide 48

Slide 48 text

2. オートローディング規約 大好き

Slide 49

Slide 49 text

2. オートローディング規約 PSRが作り、composerが育てた エコシステムに乗っかってみよう

Slide 50

Slide 50 text

1. コーディングスタイル 2. オートローディング規約 3. インターフェース よくわかるPSRのすべて

Slide 51

Slide 51 text

3. インターフェース ここからちょっと難しい話

Slide 52

Slide 52 text

3. インターフェース インターフェースってなに?

Slide 53

Slide 53 text

3. インターフェース インターフェース (英: interface) はインタフェース、インタ フェイス、インターフェイスとも書き、英語で界面や接触面、 中間面などといった意味を持ち、転じてコンピュータと周辺機 器の接続部分を表すようになった。さらに、ユーザーインター フェースなどのように、人間と自動機械との間の複雑な操作 をする手順・規則との意味にも使われる。

Slide 54

Slide 54 text

3. インターフェース

Slide 55

Slide 55 text

3. インターフェース 「インターフェース」は「実装」するもの

Slide 56

Slide 56 text

3. インターフェース 例えばUSB「インターフェース」

Slide 57

Slide 57 text

3. インターフェース

Slide 58

Slide 58 text

3. インターフェース これらはすべてUSBの「実装」

Slide 59

Slide 59 text

3. インターフェース なぜインターフェースが必要なのか?

Slide 60

Slide 60 text

3. インターフェース 同一のインターフェースを実装すると 制御(ホスト)側が助かる

Slide 61

Slide 61 text

3. インターフェース USBホスト

Slide 62

Slide 62 text

3. インターフェース PHPでインターフェースはこう書く

Slide 63

Slide 63 text

3. インターフェース interface USB { public function plug(); public function unplug(); }

Slide 64

Slide 64 text

3. インターフェース 実装はこう

Slide 65

Slide 65 text

3. インターフェース class Mouse implements USB { public function plug() { ... } public function unplug() { ... } }

Slide 66

Slide 66 text

3. インターフェース 本題

Slide 67

Slide 67 text

3. インターフェース 一部のPSRでは インターフェースを定義している

Slide 68

Slide 68 text

- PSR-3 - PSR-6 - PSR-7 - PSR-11 - PSR-14 - PSR-15 - PSR-16 - PSR-17 - PSR-18 3. インターフェース

Slide 69

Slide 69 text

- PSR-3 - PSR-6 - PSR-7 - PSR-11 - PSR-14 - PSR-15 - PSR-16 - PSR-17 - PSR-18 3. インターフェース

Slide 70

Slide 70 text

- MessageInterfaceとそれに付随するインターフェースを定 義している - 超重要 PSR-7 HTTP message interfaces

Slide 71

Slide 71 text

PSR-7 HTTP message interfaces interface MessageInterface { public function getProtocolVersion(); public function getHeaders(); public function getBody(); ... }

Slide 72

Slide 72 text

PSR-7 HTTP message interfaces interface MessageInterface  →HTTPメッセージを下記のように定義する { public function getProtocolVersion();  →プロトコルバージョンを取れる(HTTP/1.1とかHTTP/2とか) public function getHeaders();  →ヘッダーを取れる public function getBody();  →本文を取れる ... }

Slide 73

Slide 73 text

PSR-7 HTTP message interfaces で?

Slide 74

Slide 74 text

- そもそもPHPはHTTPリクエストを入力として、HTTPレスポン スを出力とする言語 - HTTPリクエストもHTTPレスポンスも「HTTPメッセージ」であ る PSR-7 HTTP message interfaces

Slide 75

Slide 75 text

すべてのPHPスクリプトは HTTPメッセージを扱う ※cliとかは別 PSR-7 HTTP message interfaces

Slide 76

Slide 76 text

すべてのPHPスクリプトはPSR-7に準拠できる (しようと思えば) ※cliとかは別 PSR-7 HTTP message interfaces

Slide 77

Slide 77 text

すべてのPHPスクリプトでHTTPメッセージを 同じように扱うことができる PSR-7 HTTP message interfaces

Slide 78

Slide 78 text

PSR-7 HTTP message interfaces すごい

Slide 79

Slide 79 text

PSR-7 HTTP message interfaces これをUSBで例えるなら すべての電化製品から USBケーブルが出てる みたいな

Slide 80

Slide 80 text

PSR-7 HTTP message interfaces 便利そう

Slide 81

Slide 81 text

PSR-7 HTTP message interfaces すばらしい

Slide 82

Slide 82 text

PSR-7 HTTP message interfaces 世界平和につながる

Slide 83

Slide 83 text

PSR-7 HTTP message interfaces しかし現実はそううまくいかない…

Slide 84

Slide 84 text

PSR-7 HTTP message interfaces 世界 < PSR-7ってちょっと使いづらいから   独自で定義するわ

Slide 85

Slide 85 text

PSR-7 HTTP message interfaces 世界 < もっとはやく言ってくれれば… わざわざ既存のコードをPSR-7準拠に 書き直すメリットは小さいし…

Slide 86

Slide 86 text

PSR-7 HTTP message interfaces 世界 < PSR-7ってなに?

Slide 87

Slide 87 text

PSR-7 HTTP message interfaces 世界平和は遠い

Slide 88

Slide 88 text

PSR-7 HTTP message interfaces PSR側の意見

Slide 89

Slide 89 text

PSR-7 HTTP message interfaces この提案は、すべてのHTTPクライアントライブラリまたはサー バー側フレームワークが、準拠するようにインターフェースを変更 することを期待していません。厳密には相互運用性を目的として います。 PSR-7 Meta Documentより引用(翻訳)

Slide 90

Slide 90 text

PSR-7 HTTP message interfaces PSR < 無理にPSRに準拠しなくていいよ!   目指すのは相互運用性だから!

Slide 91

Slide 91 text

PSR-7 HTTP message interfaces 懐が深い

Slide 92

Slide 92 text

これを受けて我々はどうするべきか PSR-7 HTTP message interfaces

Slide 93

Slide 93 text

PSR-7 HTTP message interfaces 特にやるべきことはない

Slide 94

Slide 94 text

PSR-7 HTTP message interfaces が

Slide 95

Slide 95 text

PSR-7 HTTP message interfaces 平和な世界のため、 みんなが少しずつPSRに寄り添っていく 未来はありかもしれない

Slide 96

Slide 96 text

3. インターフェース PSRは他にもPHPでよく使われるものの インターフェース化を進めている

Slide 97

Slide 97 text

- PSR-3 ログ出力 - PSR-6 キャッシュ - PSR-7 HTTPメッセージ - PSR-11 コンテナ - PSR-14 イベントディスパッチャ - PSR-15 HTTPハンドラ - PSR-16 キャッシュ - PSR-17 HTTPファクトリ - PSR-18 HTTPクライアント 3. インターフェース

Slide 98

Slide 98 text

3. インターフェース みんなが使うものは できるだけ同じインターフェースを使いたいよね

Slide 99

Slide 99 text

3. インターフェース すべてのPHPスクリプトから 同じケーブルが出ているような世界にしよう

Slide 100

Slide 100 text

まとめ

Slide 101

Slide 101 text

1. コーディングスタイル 2. オートローディング規約 3. インターフェース まとめ

Slide 102

Slide 102 text

1. →コーディングスタイル統一しようね 2. オートローディング規約 3. インターフェース まとめ

Slide 103

Slide 103 text

1. →コーディングスタイル統一しようね 2. →ライブラリを使いやすくするためのルール 3. インターフェース まとめ

Slide 104

Slide 104 text

1. →コーディングスタイル統一しようね 2. →ライブラリを使いやすくするためのルール 3. →インターフェースが共通化された世界 まとめ

Slide 105

Slide 105 text

まとめ 世界に開けたPHPスクリプトを

Slide 106

Slide 106 text

まとめ 開発は自分一人でするものではない

Slide 107

Slide 107 text

まとめ 世界の誰かが作ったライブラリに お世話になる

Slide 108

Slide 108 text

まとめ 世界の誰かが自分のライブラリを 使うかもしれない

Slide 109

Slide 109 text

まとめ みんなのためのPHPを書こう

Slide 110

Slide 110 text

ありがとうございました