我有一个定义某个接口的php库(a)。
我有一个PHP库(b),该类有一个实现接口的类。
我有PHP CLI项目,同时需要库和实现接口的类。
目前,我有一个composer.json文件,需要libaries a和b。
两个库A和B中的composer.json
文件都有用于PSR-4自动加载的定义。有没有一种方法可以使PHP在项目B(在供应商目录中)中的类别中查看类?
我找到了一个接近的其他问题的答案,但我认为它不起作用,因为我从不加载该类(自动),因为我从不 require
或 use
it。
https://stackoverflow.com/a/3993796/1053785
我问题的一个例子。
库一个指定
namespace a;
interface Singer{
public function sing(): void;
}
库B指定:
namespace b;
use aSinger;
class Clefairy implements Singer{
public function sing(): void{
echo "Clefairy...";
}
}
PHP CLI项目的作曲家文件指定
{
...
"require": {
"A": "*",
"B": "*"
}
...
}
它有一个main.php
require __DIR__ . '/vendor/autoload.php';
use aSinger;
function findMeASinger(): Singer{
// look for classes in vendor/ that implement a Singer and if so, return (the first) instance
}
$singer = findMeASinger(); //bClefairy should be found and an instance should be returned.
$singer->sing();
我现在最接近的是在composer.json文件中指定此文件,该文件需要PHP始终加载类文件。
"autoload": {
"psr-4": {
"b\": "src/"
},
"files": ["src/Clefairy.php"]
}
然后在我的PHP CLI项目中此功能找到bClefairy
。
require __DIR__ . '/vendor/autoload.php';
use aSinger;
function findMeASinger(): Singer{
$classes = get_declared_classes();
/**
* @var $implementsIModule ReflectionClass[]
*/
$implementsIModule = array();
foreach($classes as $klass) {
$reflect = new ReflectionClass($klass);
if($reflect->implementsInterface('aSinger')){
echo "Found Singer $klassn";
$implementsIModule[] = $reflect;
}
}
if(sizeof($implementsIModule) > 0){
return $implementsIModule[0]->newInstance();
}else{
throw new Exception("Could not find a Singer");
}
}
$singer = findMeASinger(); //bClefairy should be found and an instance should be returned.
$singer->sing();