一些不懂的套路和语法
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');