容器类
之前学的注册数也是容器。
对象变量必须通过依赖注入来传。参数可以通过方法传。
容器类中含有闭包,其他的是关于异常。
容器类是单例模式。static::$instance 的static是后期延迟绑定:当前静态方法不一定是当前类的。
bind方法与set方法跟set差不多。
make方法是类的实例化 = get方法。
bindParams 参数是单独传入时使用。
以上可以查阅container类里封装的方法。
容器和依赖注入的原理
任何的url访问,最终都是定位到控制器,由控制器中某个具体的方法去执行,由控制器的某个方法去执行。
Q1:一个控制器对应一个类,如果这些类需要进行统一管理,怎么办?
A:容器进行类管理,但是容器不管理控制器。还可以将类的实例/对象作为参数,传递给类方法。自动触发以来注入。
依赖注入:将对象类型的数据以参数的方式传到方法的参数列表中。
url访问:域名/index.php/模块/控制器/方法 =>通过get方式将数据传到控制器的指定方法中,只能传字符串、数值。
通过依赖注入向类中的方法传入对象。
Q2: trait是否可以?
1.common里创建一个类
class Temp
{
private $name;
puvlic function __construct($name='hys')
{
}
public function getName()
{
return '方法是'.__METHOD__;
}
}
当前文件有命名空间的时候当访问其他文件的类时路径需要从根文件开始 :public function getMethod(\app\common\Temp t e m p ) 将 会 触 发 以 来 注 入 ; 相 当 于 temp){} 将会触发以来注入;相当于 temp)将会触发以来注入;相当于temp=new\app\common\Temp;
绑定一个类到容器
进去的时候是类,出来的时候是一个对象。
public function bindClass()
{
//把一个类放到/注册到容器中
//容器类在 thinkphp/library/think/container
//可以使用助手函数简化 bind() 配合ap()获取
\think\Container::set('temp','\app\common\temp');
//用类中的构造方法进行在实例化时初始化
$temp = \think\Container::get('temp',['name'=>'hys']);
return $temp->getName(); //getName方法是自定义的
}
绑定一个闭包(closure)到容器
闭包可以理解为一个匿名函数。
\think\Container::set('demo',function($domain){
return ‘域名是:’.$domian;
return \think\Container::get('demo',['domain'=>['domain'=>'mysite.io']);
})
闭包:方便查询数据
$domo = function($domain){
return $domian;
};
静态代理
Facade 门面为容器中的类提供了一个静态调用接口,相比于传统的静态方法调用,带来了更好地可测试性和扩展性。可以为任何的非静态类库定义一个facade类。
如果想静态调用一个动态方法,需要给当前类绑定一个静态代理的类。
在app下面创建一个facade文件夹里面定义类文件,然后在控制器类静态调用,调用时需要
use app\facade\filename;
class xxx
{
public function index()
{
return filename::hello(); //静态调用
}
}
link:https://blog.cs
在facade 下面的类文件需要有:
静态绑定:
protected static function getFacadeClass()
{
return 'url'; //url为访问的方法类文件url
}
也可以直接在当前静态调用方法的文件中添加语句:
\think\Facade::bind(‘app\facade\Test’,‘app\common\Test’); // 动态绑定
dn.net/happmaoo/article/details/83219740 静态调用与动态调用
request 请求对象
传统方式:
new Request
静态代理:
use think\facade\Request;
Request::get() 将当前url赋的变量值取得
不用静态代理时:
use think\Request;
$request = newRequest();
$request->get();
如果类文件extends controller:
t
h
i
s
−
>
r
e
q
u
e
s
t
−
>
g
e
t
(
)
;
/
/
this->request->get(); //
this−>request−>get();//this->request 相当于new Request()