PhpStorm を使っていて、意図しないで Multiple definitions exist for class LoggerInterface
が発生していて、それを納得いく方法で解決出来ずにモヤモヤしていました。
でも、JetBrains 公式の人に聞いてみたら、やっぱりこの方法で良いんじゃないか、ということだったので少し自信がついたのでメモっておきます。
@DQNEO さんにご指摘いただきましたが、.phar ファイルを無視する方法がありました。
ついでに参考まで公式ヘルプも
https://www.jetbrains.com/help/phpstorm/excluding-files-from-project.html
.phar ファイルを無視すれば解決ですが、一応別解として情報は残しておきます。
前提条件として、使用する composer
に phar ファイルをプロジェクト内で配置していて、なおかつ PhpStorm の composer にその phar ファイルを設定している場合とかで発生すると思います。
(個人の理解では)
composer.phar
には依存するパッケージが埋め込まれている、PhpStorm はプロジェクトに配置された phar ファイルに埋め込まれたパッケージもライブラリーとみなす。(これは composer.phar のパスを設定しないで、単純に phar ファイルをプロジェクトに置いただけでも一緒かも)
composer で依存管理しているパッケージも、PhpStrom が自動でインクルード・パスに追加してくれるので、PSR-3 Logger Interface
のように composer.phar
の内部でも使用していて、それをプロジェクトでもインストールしている場合には、2重に定義されて表題のような動作になるんだと考えています。
以下のような手順で、単純に再現できます。
$ mkdir foo
$ cd !$
$ curl -sS https://getcomposer.org/installer | php
$ ./composer.phar init
$ /composer.phar require psr/log
(PhpStorm の composer を設定)
そうすると、以下のようなPHPで Multiple definitions exist for class LoggerInterface
の発生を確認できる。
<?php
use Psr\Log\LoggerInterface;
class sample
{
public function __construct(LoggerInterface $logger)
{
}
}
これは PSR-3 Logger Interface
が二重に定義されているのが原因だと考えられるので、php のインクルード・パスから /vendor/psr/log
を削除してやれば一応解決します。
プログラムで使用している依存パッケージをインクルード・パスから削除して、プログラムでは使用していない phar ファイルのライブラリを使用する、というのが気持ち悪いしバージョンに差異などあると困るので、上記の方法よりも .phar を無視する方法の方がスマートだと思います。
さらに追記
nesbot/carbon
に名前空間なしの JsonSerializable
インタフェースが定義されていて、PHP 標準の方のインタフェースを記述したつもりが「Multiple definitions exist」になってしまう。
解決策を少し悩んだけど、vendor/nesbot/carbon/src/JsonSerializable.php
のファイルを右クリックして、「Mark as Plain Text」を選ぶという強引で単純な解決方法しか思いつきませんでした。