PHPStanから指摘される主要な問題を解決する - 静的解析向上委員会(1)

2024/09/09に公開

動作保証もしてくれよ

PHPは型に甘くバグが多い
永年そう謂われてきた。
nullとfalseと空文字と0が同じ扱いなんて言語は他にない

TypeScriptが一般化した影響かPHPにも型を正確にしようとする動きがここ5年ぐらいで大きくなっている
主要なツールはPhan, Psalm, PHPStanで、
一番主流なのがPHPStanだと思う。

ただ、いざ導入すると想像以上に指摘がでてくる。
(エラーという表現は正しくないので指摘といっている)
構文エラーの類とは違って直せばいいわけではなく、
動作は保証してくれないので解決には慎重に行う必要がある。

あと、言語標準では表現できないことも多いので、
コメントアウトに補足を大量に書く必要がある。

('Д') 頭おかしなるわ!

そこでPHPStanを使うと大体指摘されるものを列挙していく。
まともに解決しようとすると発狂するレベルなので、
コードをなるべく書き換えない方向で。

ヾ(・ω<)ノ" 三三三● ⅱⅲ コロコロ♪

------------------- ↓ 本題はここから ↓-------------------

Unsafe usage of new static().

意外と知らない人が多い static
static 変数やメソッドのような静的なものを作るのとは異なり、
selfparentの使い方に近い

<?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();
  }
}

https://phpstan.org/blog/solving-phpstan-error-unsafe-usage-of-new-static


まとめて書こうかと思ったが、
物量が多すぎるのでシリーズ化しよ。

Discussion