Page 1
PHPStan拡張
クイックマスター
Fast-learning PHPStan extension
pixiv Inc.
USAMI Kenta
2023-08-04 Lint Night #2
#dena_lint_night
公開日:
by USAMI Kenta@tadsan
に東京都渋谷区の渋谷スクランブルスクエア40F DeNAラウンジで開催された『Lint Night #2』で20分枠として発表しました。
PHPStan拡張
クイックマスター
Fast-learning PHPStan extension
pixiv Inc.
USAMI Kenta
2023-08-04 Lint Night #2
#dena_lint_night
お前誰よ
emacs-php
PHPカンファレンス沖縄2023
LLイベント
LLイベント
LLイベント
PHPって
どんな言語?
PHPの型にどのような 印象を持っていますか?
P H P の原作者
ラスマスかく語りき
“We have things like protected properties. We have abstract methods. We have all this stuff that your computer science teacher told
you you should be using.
I don't care about this crap at all.”
–Rasmus Lerdorf
https://en.wikiquote.org/wiki/Rasmus_Lerdorf
には プロパティも
“PHP protected
抽象メソッドもありますよ。計算機科学の
教授が「使え」と言ってるものは全部。
そんなことはクソ興味ないですけど
”
–Rasmus Lerdorf
脆弱性 ゆるふわ 弱い型 動的
クソザコ 型なし 意味不明 弱い 自動変換 貧弱 Perlっぽい 適当
PHPについてのパブリックイメージ
脆弱性 ゆるふわ 弱い型 動的
クソザコ 型なし 意味不明 弱い 自動変換 貧弱 Perlっぽい 適当
PHPについての認識は概ね間違い
PHPの進化は 型宣言の進化
型がついていない関数(PHP5)
function add($a, $b) {
return $a + $b;
}
スカラー型宣言(PHP7)
int + intって
本当にintなの?
function add(int $a, int $b): int {
return $a + $b;
}
広い値をとるにはfloatが必要
ひとつの解決策では
あるが… 不必要に(cid:152)oat
を強制するのか
function add(float $a, float $b): float {
return $a + $b;
}
PHPDocの型注釈
(アノテーション)
/**
* @param int|float $a
あえて型宣言を省略する
* @param int|float $b
* @return int|float
*/
function add($a, $b) {
return $a + $b;
}
ユニオン型宣言 (PHP8.0)
function add(int|float $a, int|float $b): int|float {
return $a + $b;
}
PHPは強く実行時に保証される型
ユニオン型宣言 (PHP8.0)
intと(cid:152)oat以外は 絶対にありえない
function add(int|float $a, int|float $b): int|float {
return $a + $b;
}
PHPDocの型注釈
(アノテーション)
/**
ランタイムにとっては
* @param int|float $a
ただのコメント
(口約束)
* @param int|float $b
* @return int|float
*/
function add($a, $b) {
return $a + $b;
}
201X年、PHPは 型の炎に包まれた!!
いまやPHPは
静的型付きと言っても
過言ではない
(本当か…?)
だが型なしは
滅びていなかった
型宣言では配列要素の
型を表現できない
PHP組み込み型の限界
Bookクラスは複数の著者を持つ
arrayにすることで
class Book
複数であることを表現
{
function __construct(
private array $authors
) {
何も書かなくてもプロパティに代入される
//
Authorクラスの
}
情報が減ってる…
}
arrayには無限の可能性
PHPDocの帰還
配列の形状はコメントで書く
class Book
{
function __construct(
/** @var list<Authors> */
private array $authors
) {
何も書かなくてもプロパティに代入される
//
}
}
PHPと型の現在地点
PHPStan
PHP Static Analysis Tool
PHPStanとは
PHPStan拡張
PHPStanの基礎
PHPStanの型システム
Rule拡張でできること
実装するルールが
Rule拡張
対象とする構文木の
ノードクラス名
構文木を受け取って
エラーを配列として返す
StaticMockRule拡張
Type-Specifying拡張
メソッド呼び出しのクラス名
実装する拡張が
対象のメソッド呼び出しかどうか
構文木を受け取って型を返す
Type-Specifying拡張でできること
ReverseRouteReturnTypeExtension
メソッド呼び出しのクラス名
クラスに属する
メソッド全部が対象
ReverseRouteReturnTypeExtension
新しい型
string&non-emptyを返す
ParamHelperTypeSpecifyingExtension
