SlideShare a Scribd company logo
モダンPHP テクニック12 選
―PsalmとPHP 8.1で今はこんなこともできる!―
五十嵐進士(sji)
自己紹介
sji / sj-i / @sji_ch
SNS 上でのアイコンはGitHub が自
動生成した奴
生まれも育ちも仙台
PHP カンファレンス仙台とかやった
ふつうのサラリーマン
株式会社インフィニットループ仙台
支社所属
スマホゲーのサーバサイドプログラ
マ
その他
一昨年娘ができた
かわいい
WEB+DB PRESS の現PHP 連載担当
12/24(金)発売の126号はPHP
8.1 の紹介
Agenda
PHP の今について
モダンなPHP のテクニック12 個くらい紹介
PHP の今
PHP 8.1 が出た
型の表現力が強化され、扱いも更に厳格化
readonly
never
交差型
Enum、などなど
Fiber で非同期処理が更に便利に
汎用言語化が更に進む
「ゆるふわPHP が汎用言語ですって?」
お前らPHPの型がゆるふわゆるふわ言うけど
な、PHPなら型を宣言した値が勝手にnullに
なったりしねーし
一部の言語、ここで血反吐をはき倒れる
ていうか、今のPHP はもうそんなにゆるふわ
でもないんです!
大静的型解析時代
型情報を使う静的解析ツールが隆盛
PHPStan
Psalm
Phan
静的解析ツールは言語の弱点を補うものとなりがり
PHP はゆるふわな型が弱点
ガチガチな静的解析ツールで補う
JetBrains の調査いわく
「どんな品質ツールを使っていますか」
PHPStan Psalm Phan 計
2019 9% 1% 5% 15%
2020 11% 3% 2% 16%
2021 18% 9% 2% 29%
「静的解析ツールを使ってますか」
はい いいえ なにそれ
2021 33% 38% 28%
https://www.jetbrains.com/lp/devecosystem-2019/php/
https://www.jetbrains.com/lp/devecosystem-2020/php/
https://www.jetbrains.com/lp/devecosystem-2021/php/
静的型解析の何が嬉しい?
実行しなくてもバグに気づける
PHP の言語自体を超えた型の表現力
エディタの補完やナビゲーションの強化
Psalm
Vimeo で使われている静的解析ツール
先日原作者は卒業した、が、今も活発に開発
比較的型の表現力が高い
ここから12 のワザを大紹介
1. クラスをボコボコ生やす
PHP でデータや処理に型をつける
最強の手段
言語機能やツールの恩恵を最大限に
得られる
Constructor Property Promotion
最高
ちょっとした処理や値の表現でもク
ラスを定義
class SomeThing

{

public function __construct(

public int $id,

public string $name,

public Dependency $obj,

) {

}

}
2. DI コンテナでautowiring
多くのDI コンテナで利用可能
Laravel のContainer やPHP-DI
など
コンストラクタへ依存クラスを並べ
ていくだけ
自分でnew するのはVO とかテスト
とかごく一部に
Laravel でもFacade よりDI
// DI コンテナが勝手に依存先を生成

public function __construct(

public readonly Dependency1 $obj1
public readonly Dependency2 $obj2
) {

}
3. 型は早めにつける
@varより@param
どんどん呼び出し元へ追いやる
結果コントローラなどリクエス
トの入口のほうに
誤りは早く検知できるほどよい
リリースの後より前
テスト環境よりCI
CI より手元のエディタ
リクエスト処理の後半より前半


// こっちより

public function f(array $items) {

/** @var Item $item */

foreach ($items as $item) {

}

}



// こっち

/** @param Item[] $items */

public function f(array $items) {

foreach ($items as $item) {

}

}
4. 静的解析可能な入力値検査
一部ライブラリで静的型検査フレ
ンドリーに入力値の検査やキャス
トが可能
webmozart/assert
azjezz/psl
cuyz/valinor
OpenAPI やJSON scheme などIDL
からのクラス自動生成も有効
// webmozart/assert の例

Assert::integer($id);

// $id はこの先 int 扱い



// azjezz/psl の例

$spec = Typeshape([

'id' => Typeint(),

'name' => Typestring(),

'age' => Typeoptional(

Typeint()

)

]);

// $input をバリデーションしつつキャスト

$input = $spec->coerce($_POST['input']
// $input はこの先で↓の扱い

// array{id: int, name: string, age?:
5. 静的解析可能なconfig
連想配列のかわりにValueObject を
使う
DI コンテナに登録して取り出すの
もよい
型の保護や補完が効く
名前付き引数を利用
順番の意識が不要に
設定項目の追加や削除なども静
的に検知可能
return new DatabaseConfiguration(

driver: new MySQLDriverConfiguration
host: 'localhost',

port: 3306,

db_name: 'test_db',

username: 'test',

password: 'mogera',

),

)
6. 静的解析可能なCollection を使う
最近illuminate/collections がジェネ
リクスに対応
doctrine/collections も以前からジェ
ネリクスに対応
PhpStorm もそれらのジェネリクス
にある程度対応
あかん場合は@varと@psalm-
ignore-varを併用


/** @param Collection<User> $users */

public function f(Collection $users)
foreach ($users as $user) {

// $user は User として型推論

}

}
7. 静的解析可能なOrm を使う
doctrine/orm
cycle/orm も2 系以降でいくらか
eloquent はlarave-pluginやアノテー
ション生成が必要
Orm を自作してでも静的解析に対
応させる
cuyz/valinor など既存hydrator
の利用も可
// $user は User|null と推論される

$user = $entityManager

->getRepository(User::class)

->find(1);
8. 静的解析可能な配列を使う
psalm の型アノテーションでは配
列のキーや値の型が指定可能
「連番の数値添字が0から順に並ん
だ配列」(list)も指定可能
non-empty-array やnon-empty-list
もある
Shapes で構造体的な配列やタプル
も宣言できる
/** @param array<ItemType> $p */

/** @param array<int, ItemType> $p */

/** @param list<ItemType> $p */

/** @param non-empty-array<ItemType> $p
/**

* @param array{

* id: int,

* name: string

* } $p 

*/

/** @param array{int, string} */
9. 静的解析可能な分岐網羅を使う
PHP 8.0 で入ったmatch は分岐網羅
検査がある
想定してない値が来ると例外
Psalm はdefault のないmatch や
switch で静的に分岐網羅を検査でき
る場合がある
値のUnion やEnum をうまく使う
無闇に可変関数呼び出しなどの動的
処理は使わない、愚直に分岐を書く
enum Result {

case Succeed;

case Failed;

}



// ResultStatus::Failed を網羅してないの
// 静的解析段階でエラーになる

function f(Result $status): int {

return match ($status) {

ResultStatus::Succeed => 1,

};

}
10. 書き込み、状態を減らす
PHP 8.1 でreadonly が追加
Psalm でも@immutable や@pure
などがある
なるべく完全コンストラクタ+不変
状態を持たない= 各生成時点で全情
報が必要
小さなクラスが増え神クラス化
も防ぎやすくなる
class ReadOnlyClass

{

public function __construct(

public readonly int $id,

public readonly string $name,

) {

}

}

/** @psalm-immutable */

class ImmutableClass

{

public function __construct(

public int $id,

public string $name,

) {

}

}
11. なるべく多くを型で表現
ValueObject 、DTO みたいなのをバ
ンバン作る
ID の種類ごとに異なるクラスを定
義する
ジェネリクスを使ってもよい
実クラスを定義しなくとも型
タグを使える
ちかぢか同僚が会社のブロ
グで紹介するかも
trait ItemId {

public function __construct(

public readonly int $value,

) {

}

}

class ConsumableItemId {use ItemId;}

class EquipmentItemId {use ItemId;}



class Consumableuser {

public function useItem(

ConsumableItemId $item_id

): void {

}

}
12. Package-By-Feature (に寄せる)
UserController
UserModel
UserView
ItemController
ItemModel
ItemView
CurrencyController
CurrencyModel
CurrencyView
User Item Currency
Package By Feature


UserModel
ItemModel
CurrencyModel
UserController
ItemController
CurrencyController
UserView
ItemView
CurrencyView
Model Controller View
Package By Layer
PBL (Package-By-Layer) へ寄せすぎない
〜Controllerだけのディレクトリ
〜Repositoryだけのディレクトリ
何が嬉しいのか
@psalm-internal がうまく機能するよう書く
13. みんな(会社を動かして)PHP
Foundation に寄付をするんだ
おしまい

More Related Content

What's hot (20)

PDF
例外設計における大罪
Takuto Wada
 
PDF
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
 
PDF
MySQL 5.7にやられないためにおぼえておいてほしいこと
yoku0825
 
PDF
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
sasezaki
 
PPTX
PHP と SAPI と ZendEngine3 と
do_aki
 
PDF
PHP 8 と V8 (JavaScript) で速さを見比べてみよう!
shinjiigarashi
 
PDF
オブジェクト指向エクササイズのススメ
Yoji Kanno
 
PDF
シェル芸初心者によるシェル芸入門
icchy
 
PDF
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
naoki koyama
 
PDF
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
Shohei Okada
 
PDF
Swagger ではない OpenAPI Specification 3.0 による API サーバー開発
Yahoo!デベロッパーネットワーク
 
PPTX
世界一わかりやすいClean Architecture
Atsushi Nakamura
 
PDF
Where狙いのキー、order by狙いのキー
yoku0825
 
PDF
日本語テストメソッドについて
kumake
 
PDF
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
 
PDF
こわくない Git
Kota Saito
 
PDF
コンテナの作り方「Dockerは裏方で何をしているのか?」
Masahito Zembutsu
 
PDF
Pythonによる黒魔術入門
大樹 小倉
 
PDF
ドメイン駆動設計に15年取り組んでわかったこと
増田 亨
 
PPTX
JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)
NTT DATA Technology & Innovation
 
例外設計における大罪
Takuto Wada
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
 
MySQL 5.7にやられないためにおぼえておいてほしいこと
yoku0825
 
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
sasezaki
 
PHP と SAPI と ZendEngine3 と
do_aki
 
PHP 8 と V8 (JavaScript) で速さを見比べてみよう!
shinjiigarashi
 
オブジェクト指向エクササイズのススメ
Yoji Kanno
 
シェル芸初心者によるシェル芸入門
icchy
 
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
naoki koyama
 
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
Shohei Okada
 
Swagger ではない OpenAPI Specification 3.0 による API サーバー開発
Yahoo!デベロッパーネットワーク
 
世界一わかりやすいClean Architecture
Atsushi Nakamura
 
Where狙いのキー、order by狙いのキー
yoku0825
 
日本語テストメソッドについて
kumake
 
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
 
こわくない Git
Kota Saito
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
Masahito Zembutsu
 
Pythonによる黒魔術入門
大樹 小倉
 
ドメイン駆動設計に15年取り組んでわかったこと
増田 亨
 
JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)
NTT DATA Technology & Innovation
 

Similar to モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!― (20)

PDF
PHPの今とこれから2014
Rui Hirokawa
 
PPTX
PHP基礎勉強会
Yuji Otani
 
PDF
Modern PHP Programming @ PFI Seminar
Sotaro Karasawa
 
PDF
PHPの今とこれから2024 at PHP Conference Japan 2024
Rui Hirokawa
 
PDF
PHPの今とこれから 2013
Rui Hirokawa
 
PDF
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情
Junichi Ishida
 
PDF
PHPの今とこれから2018
Rui Hirokawa
 
PDF
PHPの今とこれから2017
Rui Hirokawa
 
PDF
PHPの今とこれから2023
Rui Hirokawa
 
PPTX
Php5 4勉強会
Yuji Otani
 
PDF
PHPの今とこれから2025 (PHP Conference Japan 2025)
Rui Hirokawa
 
PDF
PHPの今とこれから2015
Rui Hirokawa
 
PDF
PhpStormを使おう --高槻からは快速急行が早くなります #jbugj
Hisateru Tanaka
 
PDF
PHP初心者セッション2023 〜ChatGPT時代の簡単な始め方〜
Hideo Kashioka
 
PDF
eZ Publish勉強会9月〜テンプレート言語〜
ericsagnes
 
PDF
PHPの今とこれから2021
Rui Hirokawa
 
PDF
徹底攻略!PHP5.4
Takuya Sato
 
PDF
Introduction to Roslyn
Yuki Igarashi
 
PDF
PHPの今とこれから2022
Rui Hirokawa
 
PDF
PHPの今とこれから2016
Rui Hirokawa
 
PHPの今とこれから2014
Rui Hirokawa
 
PHP基礎勉強会
Yuji Otani
 
Modern PHP Programming @ PFI Seminar
Sotaro Karasawa
 
PHPの今とこれから2024 at PHP Conference Japan 2024
Rui Hirokawa
 
PHPの今とこれから 2013
Rui Hirokawa
 
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情
Junichi Ishida
 
PHPの今とこれから2018
Rui Hirokawa
 
PHPの今とこれから2017
Rui Hirokawa
 
PHPの今とこれから2023
Rui Hirokawa
 
Php5 4勉強会
Yuji Otani
 
PHPの今とこれから2025 (PHP Conference Japan 2025)
Rui Hirokawa
 
PHPの今とこれから2015
Rui Hirokawa
 
PhpStormを使おう --高槻からは快速急行が早くなります #jbugj
Hisateru Tanaka
 
PHP初心者セッション2023 〜ChatGPT時代の簡単な始め方〜
Hideo Kashioka
 
eZ Publish勉強会9月〜テンプレート言語〜
ericsagnes
 
PHPの今とこれから2021
Rui Hirokawa
 
徹底攻略!PHP5.4
Takuya Sato
 
Introduction to Roslyn
Yuki Igarashi
 
PHPの今とこれから2022
Rui Hirokawa
 
PHPの今とこれから2016
Rui Hirokawa
 
Ad

Recently uploaded (9)

PDF
Hyperledger Fabric最新v3.x系での機能強化、変更点にキャッチアップ!
LFDT Tokyo Meetup
 
PDF
生成AIパネルトーク(Interop25Tokyo APPS JAPAN M1-07,M2-07 嶋ポジショントーク)
嶋 是一 (Yoshikazu SHIMA)
 
PDF
2023年版Web3技術の理想と現実
Syuhei Hiya
 
PDF
人気ブロックチェーン基盤「Hyperledger Fabric」最新版を動かしてみた!
LFDT Tokyo Meetup
 
PDF
20250630_aws_reinforce_2025_aws_sheild_network_security_director
uedayuki
 
PDF
SIG-AUDIO 2025 Vol.02 オンラインセミナー SIG-Audioプレゼン資料_オーディオプラグイン開発_塩澤達矢.pdf
IGDA Japan SIG-Audio
 
PDF
ABC2025S LT講演「世界の窓から Androidこんにちは2025」アプリ自動生成の将来?ロボティクスの夢再び?
嶋 是一 (Yoshikazu SHIMA)
 
PDF
20250710_Devinで切り拓くDB革命_〜価値創出に集中せよ〜.pdf
Masaki Yamakawa
 
PDF
Hyperledger Fabric公式サンプル fabric-samples徹底解説
LFDT Tokyo Meetup
 
Hyperledger Fabric最新v3.x系での機能強化、変更点にキャッチアップ!
LFDT Tokyo Meetup
 
生成AIパネルトーク(Interop25Tokyo APPS JAPAN M1-07,M2-07 嶋ポジショントーク)
嶋 是一 (Yoshikazu SHIMA)
 
2023年版Web3技術の理想と現実
Syuhei Hiya
 
人気ブロックチェーン基盤「Hyperledger Fabric」最新版を動かしてみた!
LFDT Tokyo Meetup
 
20250630_aws_reinforce_2025_aws_sheild_network_security_director
uedayuki
 
SIG-AUDIO 2025 Vol.02 オンラインセミナー SIG-Audioプレゼン資料_オーディオプラグイン開発_塩澤達矢.pdf
IGDA Japan SIG-Audio
 
ABC2025S LT講演「世界の窓から Androidこんにちは2025」アプリ自動生成の将来?ロボティクスの夢再び?
嶋 是一 (Yoshikazu SHIMA)
 
20250710_Devinで切り拓くDB革命_〜価値創出に集中せよ〜.pdf
Masaki Yamakawa
 
Hyperledger Fabric公式サンプル fabric-samples徹底解説
LFDT Tokyo Meetup
 
Ad

モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―