PHPStanから指摘される主要な問題を解決する - 静的解析向上委員会(1)
動作保証もしてくれよ
PHPは型に甘くバグが多い
永年そう謂われてきた。
nullとfalseと空文字と0が同じ扱いなんて言語は他にない
TypeScriptが一般化した影響かPHPにも型を正確にしようとする動きがここ5年ぐらいで大きくなっている
主要なツールはPhan, Psalm, PHPStanで、
一番主流なのがPHPStanだと思う。
ただ、いざ導入すると想像以上に指摘がでてくる。
(エラーという表現は正しくないので指摘といっている)
構文エラーの類とは違って直せばいいわけではなく、
動作は保証してくれないので解決には慎重に行う必要がある。
あと、言語標準では表現できないことも多いので、
コメントアウトに補足を大量に書く必要がある。
('Д') 頭おかしなるわ!
そこでPHPStanを使うと大体指摘されるものを列挙していく。
まともに解決しようとすると発狂するレベルなので、
コードをなるべく書き換えない方向で。
ヾ(・ω<)ノ" 三三三● ⅱⅲ コロコロ♪
------------------- ↓ 本題はここから ↓-------------------
Unsafe usage of new static().
意外と知らない人が多い static
static 変数やメソッドのような静的なものを作るのとは異なり、
self
やparent
の使い方に近い
<?php
class A {
public function __construct() {}
public static function make(): static{
return new static();
}
}
class B extends A {
}
$class = B::make();
echo get_class($class); // echo B
継承したクラスで実行すると継承先のクラスが取得される
SingletonやFactory Methodパターンはこの仕組みで作られる
ではこれをPHPStanにかけると
------ -----------------------------------------------------------------------------------
:4 Unsafe usage of new static().
💡 See: https://phpstan.org/blog/solving-phpstan-error-unsafe-usage-of-new-static
------ -----------------------------------------------------------------------------------
staticでインスタンス生成は安全じゃないよ
(´・ω・`) 大きなお世話だっての
対処法は @phpstan-consistent-constructor
アノテーションをクラスに追加する
+ /** @phpstan-consistent-constructor */
class A {
public function __construct() {}
public static function make(): static{
return new static();
}
}
まとめて書こうかと思ったが、
物量が多すぎるのでシリーズ化しよ。
Discussion