laravel的ioc简单版本

98 阅读1分钟

0963ee7ebe0ecf8f1473c8802477273.png


一些不懂的套路和语法

1 php的use语法 (匿名函数里面的use写法)

匿名函数中的use,其作用就是从父作用域继承变量。
$msg = [1,2,3];
让父类scope的变量可以给到匿名内部!!
$func = function()use($msg){
    print_r($msg);
};  

$func();

2 反射 给你一个classname你能得到他的具体一些信息

$reflector = new ReflectionClass(className);
//获取 构造
$constructor = $reflector->getConstructor();
//获取构造的参数
$dependenciesName= $constructor->getParameters();
//获取参数实例
$paramsInstace=this.getDependciesInstance(dependenciesName)
实例化对象
$relector->newInstancesArgs($paramsInstace)

3 变量名称执行方法

$methodName="sayhello"
function sayhello(){}
//会执行sayhello方法
$methodName();


容器 依赖注入的基本用法

class User{
 __constroctor(log filelog){

}
login(){}
}
app=new Ioc();
app->bind("user","User")
$userInstance=app->make("user")
$userInstance->login();

简单版本的容器实现 第一版本

容器成员和属性

bindings 是一个数组
在bind方法的时候把每个key对应的对象实例放到bindings数组中
make方法 使用反射 依赖注入

make方法的时候 参数是classname
1反射这个classname的构造函数
2 知道他的依赖是什么
3 去bindings中找打他的依赖对象
4 实例化这个对象 把参数依赖也传进去

第二版

demo
interface log
{
    public function write();
}

// 文件记录日志
class FileLog implements Log
{
    public function write(){
        echo 'file log write...';
    }
}

// 数据库记录日志
class DatabaseLog implements Log
{
    public function write(){
        echo 'database log write...';
    }
}

class User
{
    protected $log;
    public function __construct(Log $log)
    {
        $this->log = $log;
    }
    public function login()
    {
        // 登录成功,记录登录日志
        echo 'login success...';
        $this->log->write();
    }
}


使用的ioc的时候
ioc = new Ioc();
//虽然我是一个接口log,但是我的接口对应的实例是filelog对象
$ioc->bind('log','FileLog');
$ioc->bind('user','User');
$user = $ioc->make('user');