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
PSRで世界が変わる
Search
tsyama
September 28, 2019
Programming
0
230
PSRで世界が変わる
2019/9/28に行った社内勉強会で発表したスライドです。
tsyama
September 28, 2019
Tweet
Share
Other Decks in Programming
See All in Programming
チームの境界をブチ抜いていけ
tokai235
0
160
TFLintカスタムプラグインで始める Terraformコード品質管理
bells17
2
160
Goで実践するドメイン駆動開発 AIと歩み始めた新規プロダクト開発の現在地
imkaoru
4
820
dynamic!
moro
10
7.4k
止められない医療アプリ、そっと Swift 6 へ
medley
1
160
育てるアーキテクチャ:戦い抜くPythonマイクロサービスの設計と進化戦略
fujidomoe
1
170
Leading Effective Engineering Teams in the AI Era
addyosmani
1
270
タスクの特性や不確実性に応じた最適な作業スタイルの選択(ペアプロ・モブプロ・ソロプロ)と実践 / Optimal Work Style Selection: Pair, Mob, or Solo Programming.
honyanya
3
160
CSC305 Lecture 03
javiergs
PRO
0
240
組込みだけじゃない!TinyGo で始める無料クラウド開発入門
otakakot
0
230
複雑化したリポジトリをなんとかした話 pipenvからuvによるモノレポ構成への移行
satoshi256kbyte
1
1k
オープンソースソフトウェアへの解像度🔬
utam0k
13
2.6k
Featured
See All Featured
RailsConf 2023
tenderlove
30
1.2k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
33
2.5k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
15k
YesSQL, Process and Tooling at Scale
rocio
173
14k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
9
870
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Making the Leap to Tech Lead
cromwellryan
135
9.6k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.1k
Being A Developer After 40
akosma
91
590k
Building an army of robots
kneath
306
46k
Navigating Team Friction
lara
190
15k
Context Engineering - Making Every Token Count
addyosmani
5
230
Transcript
PSRで世界が変わる 2019.9.28 技術い勉強会 @tsyama
@tsyama_desu 自己紹介 @tsyama
PSRとは?
PHP Standards Recommendations (PHP標準勧告)
None
- PHP-FIGという団体が作成 - 「PHP書くときのルール決めてみたんだけど」 - 現在PSR-0からPSR-19まである - 既存のものは三種に大別できる
- PHP-FIGという団体が作成 - 「PHP書くときのルール決めてみたんだけど」 - 現在PSR-0からPSR-19まである - 既存のものは三種に大別できる
1. コーディングスタイル 2. オートローディング規約 3. インターフェース よくわかるPSRのすべて
1. コーディングスタイル 2. オートローディング規約 3. インターフェース よくわかるPSRのすべて
- PSR-1 - PSR-2 (ABANDONED) - PSR-12 1. コーディングスタイル
PSR-1 基本コーディング規約 - ファイルは `<?php`もしくは`<?=`で始める - 文字コードはUTF-8(BOM無し)を使用する - クラス名はStudlyCapsで定義する …
※StudlyCaps: 先頭大文字、単語区切り大文字
- インデントには、Tabではなく4 Spaceを使用する - 関数やクラス定義の `{` や `}` を独立した行にする -
コンマの前にSpaceを入れず、後に1 Spaceを入れる … PSR-2 コーディングスタイルガイド
public function hoge () { $hoge = “hoge”; echo $hoge;
return $hoge; } PSR-2 コーディングスタイルガイド
public function hoge () { $hoge = “hoge”; echo $hoge;
return $hoge; } PSR-2 コーディングスタイルガイド
ABANDONED (放棄)
- プロパティ/メソッドのアクセス修飾子は必ず明記する - スカラータイプヒンティングは小文字で書く - 無名クラスの書き方とか … PSR-12 拡張コーディングスタイルガイド 新たにPHP7向けに対応したコーディングスタイルガイド
これを受けて我々はどうするべきか
PSR-12 拡張コーディングスタイルガイド PSR-2と同様に、この仕様の目的は、さまざまな著者のコードを 認知摩耗を減らすことです。… したがって、このガイドの利点はルール自体ではなく、それらの ルールの共有にあります。 PSR-12 Overviewより引用(翻訳)
PSR-12 拡張コーディングスタイルガイド PSR-2と同様に、この仕様の目的は、さまざまな著者のコードを 認知摩耗を減らすことです。… したがって、このガイドの利点はルール自体ではなく、それらの ルールの共有にあります。 PSR-12 Overviewより引用(翻訳)
PSR-12 拡張コーディングスタイルガイド 「このコーディングスタイルガイドを厳守しろ」 と言っているわけではない
PSR-12 拡張コーディングスタイルガイド プロジェクト内でコーディングスタイルを 統一するということが何よりも重要 (PHPだけじゃない!)
PSR-12 拡張コーディングスタイルガイド コーディングスタイルを統一しないと起こること - Gitに余計な差分ができる - 見た目に統一感がなく、汚い - 争いが生まれる
PSR-12 拡張コーディングスタイルガイド コーディングスタイル、統一しましょう
1. コーディングスタイル 2. オートローディング規約 3. インターフェース よくわかるPSRのすべて
- PSR-0 (DEPRECATED) - PSR-4 2. オートローディング規約
2. オートローディング規約 オートローディングとは?
2. オートローディング規約 ライブラリを使いやすくする仕組み
2. オートローディング規約
2. オートローディング規約 オートローディングの仕組みを活用して PHPライブラリの管理を担う (npmとかと同じようなもの)
2. オートローディング規約 どうやって?
PSR-4 オートローダ - ライブラリファイルの置き場とそれに対応する クラス名を定義している
2. オートローディング規約 vendor
2. オートローディング規約 use \Hoge\Huga
2. オートローディング規約 require_once(‘../../../hoge/huga.php’)
2. オートローディング規約 require_once(‘../../../hoge/huga.php’)
2. オートローディング規約 composerで世界はどう変わったか
2. オートローディング規約 ライブラリ同士が 依存し、依存されやすい世界に
2. オートローディング規約 例えばLaravel
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
2. オートローディング規約 ライブラリ同士が互いに助け合う 生態系がPHPの中に生まれた
2. オートローディング規約 エコシステム
2. オートローディング規約 ちなみに
2. オートローディング規約 エコシステムを体感するの めっちゃ大事
2. オートローディング規約
2. オートローディング規約 世界のプログラマの生態系の中に 組み込まれている…!
2. オートローディング規約 うれしい
2. オートローディング規約 楽しい
2. オートローディング規約 大好き
2. オートローディング規約 PSRが作り、composerが育てた エコシステムに乗っかってみよう
1. コーディングスタイル 2. オートローディング規約 3. インターフェース よくわかるPSRのすべて
3. インターフェース ここからちょっと難しい話
3. インターフェース インターフェースってなに?
3. インターフェース インターフェース (英: interface) はインタフェース、インタ フェイス、インターフェイスとも書き、英語で界面や接触面、 中間面などといった意味を持ち、転じてコンピュータと周辺機 器の接続部分を表すようになった。さらに、ユーザーインター フェースなどのように、人間と自動機械との間の複雑な操作
をする手順・規則との意味にも使われる。
3. インターフェース
3. インターフェース 「インターフェース」は「実装」するもの
3. インターフェース 例えばUSB「インターフェース」
3. インターフェース
3. インターフェース これらはすべてUSBの「実装」
3. インターフェース なぜインターフェースが必要なのか?
3. インターフェース 同一のインターフェースを実装すると 制御(ホスト)側が助かる
3. インターフェース USBホスト
3. インターフェース PHPでインターフェースはこう書く
3. インターフェース interface USB { public function plug(); public function
unplug(); }
3. インターフェース 実装はこう
3. インターフェース class Mouse implements USB { public function plug()
{ ... } public function unplug() { ... } }
3. インターフェース 本題
3. インターフェース 一部のPSRでは インターフェースを定義している
- PSR-3 - PSR-6 - PSR-7 - PSR-11 - PSR-14
- PSR-15 - PSR-16 - PSR-17 - PSR-18 3. インターフェース
- PSR-3 - PSR-6 - PSR-7 - PSR-11 - PSR-14
- PSR-15 - PSR-16 - PSR-17 - PSR-18 3. インターフェース
- MessageInterfaceとそれに付随するインターフェースを定 義している - 超重要 PSR-7 HTTP message interfaces
PSR-7 HTTP message interfaces interface MessageInterface { public function getProtocolVersion();
public function getHeaders(); public function getBody(); ... }
PSR-7 HTTP message interfaces interface MessageInterface →HTTPメッセージを下記のように定義する { public function
getProtocolVersion(); →プロトコルバージョンを取れる(HTTP/1.1とかHTTP/2とか) public function getHeaders(); →ヘッダーを取れる public function getBody(); →本文を取れる ... }
PSR-7 HTTP message interfaces で?
- そもそもPHPはHTTPリクエストを入力として、HTTPレスポン スを出力とする言語 - HTTPリクエストもHTTPレスポンスも「HTTPメッセージ」であ る PSR-7 HTTP message interfaces
すべてのPHPスクリプトは HTTPメッセージを扱う ※cliとかは別 PSR-7 HTTP message interfaces
すべてのPHPスクリプトはPSR-7に準拠できる (しようと思えば) ※cliとかは別 PSR-7 HTTP message interfaces
すべてのPHPスクリプトでHTTPメッセージを 同じように扱うことができる PSR-7 HTTP message interfaces
PSR-7 HTTP message interfaces すごい
PSR-7 HTTP message interfaces これをUSBで例えるなら すべての電化製品から USBケーブルが出てる みたいな
PSR-7 HTTP message interfaces 便利そう
PSR-7 HTTP message interfaces すばらしい
PSR-7 HTTP message interfaces 世界平和につながる
PSR-7 HTTP message interfaces しかし現実はそううまくいかない…
PSR-7 HTTP message interfaces 世界 < PSR-7ってちょっと使いづらいから 独自で定義するわ
PSR-7 HTTP message interfaces 世界 < もっとはやく言ってくれれば… わざわざ既存のコードをPSR-7準拠に 書き直すメリットは小さいし…
PSR-7 HTTP message interfaces 世界 < PSR-7ってなに?
PSR-7 HTTP message interfaces 世界平和は遠い
PSR-7 HTTP message interfaces PSR側の意見
PSR-7 HTTP message interfaces この提案は、すべてのHTTPクライアントライブラリまたはサー バー側フレームワークが、準拠するようにインターフェースを変更 することを期待していません。厳密には相互運用性を目的として います。 PSR-7 Meta
Documentより引用(翻訳)
PSR-7 HTTP message interfaces PSR < 無理にPSRに準拠しなくていいよ! 目指すのは相互運用性だから!
PSR-7 HTTP message interfaces 懐が深い
これを受けて我々はどうするべきか PSR-7 HTTP message interfaces
PSR-7 HTTP message interfaces 特にやるべきことはない
PSR-7 HTTP message interfaces が
PSR-7 HTTP message interfaces 平和な世界のため、 みんなが少しずつPSRに寄り添っていく 未来はありかもしれない
3. インターフェース PSRは他にもPHPでよく使われるものの インターフェース化を進めている
- PSR-3 ログ出力 - PSR-6 キャッシュ - PSR-7 HTTPメッセージ -
PSR-11 コンテナ - PSR-14 イベントディスパッチャ - PSR-15 HTTPハンドラ - PSR-16 キャッシュ - PSR-17 HTTPファクトリ - PSR-18 HTTPクライアント 3. インターフェース
3. インターフェース みんなが使うものは できるだけ同じインターフェースを使いたいよね
3. インターフェース すべてのPHPスクリプトから 同じケーブルが出ているような世界にしよう
まとめ
1. コーディングスタイル 2. オートローディング規約 3. インターフェース まとめ
1. →コーディングスタイル統一しようね 2. オートローディング規約 3. インターフェース まとめ
1. →コーディングスタイル統一しようね 2. →ライブラリを使いやすくするためのルール 3. インターフェース まとめ
1. →コーディングスタイル統一しようね 2. →ライブラリを使いやすくするためのルール 3. →インターフェースが共通化された世界 まとめ
まとめ 世界に開けたPHPスクリプトを
まとめ 開発は自分一人でするものではない
まとめ 世界の誰かが作ったライブラリに お世話になる
まとめ 世界の誰かが自分のライブラリを 使うかもしれない
まとめ みんなのためのPHPを書こう
ありがとうございました