我有一个项目,其中包含以下composer.json依赖项:
"propel/propel1": "dev-master"`,
"halleck45/phpmetrics": "dev-master"
Run Code Online (Sandbox Code Playgroud)
我最近做了一个composer update并发现PhpMetrics所需的新版本的库,称为Hoa,它引入了一个新类\EngineException来模拟一个新的PHP7类.不幸的是,Propel 1也定义了\EngineException,因此产生了冲突.
对此的正确解决方法是升级到使用命名空间的Propel 2.然而,这仍然是阿尔法并且受到BC断裂的影响,因此对我来说并不可行.
我目前的解决方法是将Hoa锁定到没有新类的特定版本:
"hoa/core": "2.15.04.*"
Run Code Online (Sandbox Code Playgroud)
这不是一个糟糕的解决方案,但将库锁定到旧版本并不完全令人满意.
在Hoa代码中,不加载新类的唯一方法是运行PHP 7,这也是不可行的.但是,require当PhpMetrics运行时,我只会想到Hoa只需要d.这是一个独立的代码分析工具,为方便起见,它只位于项目的根目录中; 项目的其余部分不使用此库.
因此,如果我可以在Composer中调用某个东西来询问这个类是不是(自动)加载,或者可能是某些事情要做同样的事情,那将会很棒composer.json.它目前正在被不必要地加载 - 我不知道它是否被错误自动加载或者是否require由Composer手动加载.
可能有助于知道Composer将Hoa类添加到自动生成的autoload_psr4.php脚本中.据我所知,这意味着它是自动加载的,我的项目中没有任何东西需要任何Hoa类.
我很好奇,所以就查了一下。Hoa 确实有一种破碎的方法,通过 Composer 中的“文件”自动加载Core.php来始终包含文件,而 Composer 中又包含. 后者定义了你的班级。Consistency.php
您可以向 Hoa 的开发人员提出问题,用于class_exists检查方法而不是他们正在使用的当前版本检查。这可能会导致推进自动加载器加载自己的内容。另一种方法是正确定义它们的自动加载,但它们看起来更喜欢手动加载。