搜索在 composer.json 所需的依赖项中实现某个接口的类



我有一个定义某个接口的php库(a)。

我有一个PHP库(b),该类有一个实现接口的类。

我有PHP CLI项目,同时需要库和实现接口的类。

目前,我有一个composer.json文件,需要libaries a和b。

两个库A和B中的composer.json文件都有用于PSR-4自动加载的定义。有没有一种方法可以使PHP在项目B(在供应商目录中)中的类别中查看类?

我找到了一个接近的其他问题的答案,但我认为它不起作用,因为我从不加载该类(自动),因为我从不 requireuse 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();

相关内容

  • 没有找到相关文章

最新更新