Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
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
S3 VectorsとStrands Agentsを利用したAgentic RAGシステムの構築
tosuri13
6
300
ハイパーメディア駆動アプリケーションとIslandアーキテクチャ: htmxによるWebアプリケーション開発と動的UIの局所的適用
nowaki28
0
400
AIコーディングエージェント(skywork)
kondai24
0
160
WebRTC、 綺麗に見るか滑らかに見るか
sublimer
1
160
React Native New Architecture 移行実践報告
taminif
1
150
令和最新版Android Studioで化石デバイス向けアプリを作る
arkw
0
380
從冷知識到漏洞,你不懂的 Web,駭客懂 - Huli @ WebConf Taiwan 2025
aszx87410
2
1.7k
Giselleで作るAI QAアシスタント 〜 Pull Requestレビューに継続的QAを
codenote
0
120
エディターってAIで操作できるんだぜ
kis9a
0
710
AIの誤りが許されない業務システムにおいて“信頼されるAI” を目指す / building-trusted-ai-systems
yuya4
6
2.6k
堅牢なフロントエンドテスト基盤を構築するために行った取り組み
shogo4131
8
2.3k
ローターアクトEクラブ アメリカンナイト:川端 柚菜 氏(Japan O.K. ローターアクトEクラブ 会長):2720 Japan O.K. ロータリーEクラブ2025年12月1日卓話
2720japanoke
0
720
Featured
See All Featured
Product Roadmaps are Hard
iamctodd
PRO
55
12k
Raft: Consensus for Rubyists
vanstee
141
7.2k
Why Our Code Smells
bkeepers
PRO
340
57k
YesSQL, Process and Tooling at Scale
rocio
174
15k
How to Think Like a Performance Engineer
csswizardry
28
2.4k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.3k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Producing Creativity
orderedlist
PRO
348
40k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
The Pragmatic Product Professional
lauravandoore
37
7.1k
Art, The Web, and Tiny UX
lynnandtonic
303
21k
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を書こう
ありがとうございました