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分枠として発表しました。
2023-08-04 Lint Night #2
#dena_lint_night
お前誰よ
PHPってどんな言語?
PHPの型にどのような印象を持っていますか?
“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の進化は型宣言の進化
function add($a, $b) {return $a + $b;}
int + intって本当にintなの?
function add(int $a, int $b): int {return $a + $b;}
ひとつの解決策ではあるが… 不必要にfloatを強制するのか
function add(float $a, float $b): float {return $a + $b;}
あえて型宣言を省略する
/*** @param int|float $a* @param int|float $b* @return int|float*/function add($a, $b) {return $a + $b;}
function add(int|float $a, int|float $b): int|float {return $a + $b;}
PHPは強く実行時に保証される型
intとfloat以外は絶対にありえない
function add(int|float $a, int|float $b): int|float {return $a + $b;}
ランタイムにとってはただのコメント(口約束)
/*** @param int|float $a* @param int|float $b* @return int|float*/function add($a, $b) {return $a + $b;}
201X年、PHPは型の炎に包まれた!!
いまやPHPは静的型付きと言っても過言ではない(本当か…?)
だが型なしは滅びていなかった
型宣言では配列要素の型を表現できない
PHP組み込み型の限界
arrayにすることで複数であることを表現
class Book{function __construct(private array $authors) {// 何も書かなくてもプロパティに代入される
Authorクラスの情報が減ってる…
}}
配列の形状はコメントで書く
class Book{function __construct(/** @var list<Authors> */private array $authors) {// 何も書かなくてもプロパティに代入される
}}
PHPStanとは
PHPStanの基礎
実装するルールが対象とする構文木の
ノードクラス名構文木を受け取ってエラーを配列として返す
メソッド呼び出しのクラス名
実装する拡張が対象のメソッド呼び出しかどうか構文木を受け取って型を返す
Type-Specifying拡張でできること
メソッド呼び出しのクラス名
クラスに属するメソッド全部が対象
新しい型string&non-emptyを返す
