PHP依赖注入

<?php

/**
 * Class A
 */
class A
{
    protected B $b;

    /**
     * A constructor.
     * @param B $b
     */
    public function __construct(B $b)
    {
        $this->b = $b;
    }

    public function aMethod(): void
    {
        echo "我是A的方法" . $this->b->say();
    }
}

class B
{
    protected C $c;
    protected D $d;

    /**
     * B constructor.
     * @param C $c
     * @param D $d
     */
    public function __construct(C $c, D $d)
    {
        $this->c = $c;
        $this->d = $d;
    }

    /**
     * @return string|null
     */
    public function say(): ?string
    {
        return $this->c->say() . PHP_EOL . $this->d->say();
    }
}

class C
{
    public function say(): string
    {
        return '我是C';
    }
}

class D
{
    public function say(): string
    {
        return '我是D';
    }
}

class Ioc
{
    protected $instance;

    /**
     * @param $class
     * @return mixed|object
     * @throws ReflectionException
     */
    protected function getInstance($class)
    {
        $reflector = new ReflectionClass($class);
        // 获取类的注释信息
//        echo $reflector->getDocComment();
        // 获取反射类的构造函数信息
        $constructor = $reflector->getConstructor();

        if (!is_null($constructor)) {
            $dependencies = $constructor->getParameters();// 获取构造方法所需要的参数
            // 如果构造方法没有依赖其他对象直接返回对象实例
            if (!$dependencies) {
                return new $class();
            }
            foreach ($dependencies as $dependency) {
                if (!is_null($dependency->getClass())) {
                    $args[] = $this->make($dependency->getClass()->name);
                }
            }
            return $reflector->newInstanceArgs($args);// 从给定参数创建新的类实例。
        }
        // 没有构造方法直接返回实例
        return new $class();
    }

    /**
     * @param $class
     * @return mixed|object
     * @throws ReflectionException
     */
    public function make($class)
    {
        return $this->getInstance($class);
    }
}

$ioc = new Ioc();
$obj = $ioc->make('A');
echo $obj->aMethod();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ᖇꫀᧁᖇꫀᧁ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值