2
1

More than 5 years have passed since last update.

PhpStorm で「Multiple definitions exist for class LoggerInterface」が出る場合

Last updated at Posted at 2018-06-04

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」を選ぶという強引で単純な解決方法しか思いつきませんでした。

2
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1