PHP解耦的三种状态(谈论服务容器)

PHP解耦的三种状态(谈论服务容器)
在阅读本文之前,您需要掌握:PHP语法,面向对象

在整个软件项目开发过程中,有时需要更多的合作,也可以独立完成的,或者,随着代码量的增加,写出来的控制,逐步实现肮脏的,丑陋的界面,该项目的成本和难度上升至不可持续水平的维护,只有重建或再开发。

国家的第一个国家

假设场景:我们需要编写一个可以同时操作会话、数据库和文件系统处理类。

边界特征:它可以运行,但它严重耦合。
类DB {
公共函数DB($ arg1,arg2美元){
echo'constructed!php_eol;
}
}
类文件系统{
公共功能的文件系统($美元arg1,arg2){
echo'constructed!php_eol;
}
}
会话类{
公共功能会话($ arg1,arg2美元){
echo'constructed!php_eol;
}
}
一流作家{
公共函数写入(){
$ db =新DB(1,2);
$文件系统=新文件系统(3,4);
$ SESSION =新的会话(5,6);
}
}
$作家=新作家();
写$ >写();
写作方法的缺陷:

1。若要在公共函数中构造对象,一旦涉及到数据库参数的更改,修改工作将有大量工作。

2。负责设计编写类的人员需要熟悉各种API,如DB。

有没有减少耦合的方法

第二个边界(参数依赖)

假设场景:由于不同的客户,数据库地址需要频繁更改。有很多类调用db(如果有几十个)。我希望,即使在更改了数据库地址之后,也不必修改这些类的代码。
类DB {
公共函数DB($ arg1,arg2美元){
echo'constructed!php_eol;
}
}
类文件系统{
公共功能的文件系统($美元arg1,arg2){
echo'constructed!php_eol;
}
}
会话类{
公共功能会话($ arg1,arg2美元){
echo'constructed!php_eol;
}
}
Class Writer{
保护_db美元;
保护_filesystem美元;
保护_session美元;
公共函数集($ DB,$文件系统,会话){
美元-> _db = $分贝;
美元-> _filesystem = $文件系统;
美元-> _session = $ SESSION;
}
公共函数写入(){

}
}
$ db =新DB(1,2);
$文件系统=新文件系统(3,4);
$ SESSION =新的会话(5,6);
$作家=新作家();
$写>集($ db,$文件系统,$会话);
写$ >写();
尽管DB类的结构给客户,当涉及到修改,大大减少工作量,但新的问题:为了创造一个作家班,我们需要创建一个数据库类,文件类,作家班的相关负责人,要求是很高的,他需要看到很多其他类型的文件,创建一个(可能还需要初始化),然后他想创造一个作家变。

因此,我们希望我们可以有一个更好的写作方式,这样写写类的人可以创建和调用他想要的类,界面更快,甚至不需要填写任何参数。

第三状态(IOC容器)

通过前两个世界,我们希望增加以下好处:

1。希望DB类、会议类、类和文件系统使用相同的方式,没有任何繁琐的初始化,如写$ db =新(arg1,arg2分贝);这类声明。

2。希望db和其他类型的对象是全局的,并且可以在整个程序运行期间随时调用。

三.调用DB和其他类型的程序员对类的细节不太了解,甚至不知道用字符串别名创建这样的对象。

实现上述目标是IOC容器。我们可以简单地将IOC容器视为全局变量,并将字符串和构造函数与关联数组绑定起来。

我们首先实现一个容器类
容器类{
公共$绑定;
公共函数绑定($抽象,$具体){
此绑定;
}
公共函数使($抽象,$参数{ }){
返回call_user_func_array(美元->绑定{ $摘要},为参数);
}
}
服务注册(绑定)
$容器=新容器();
集装箱->绑定美元('db功能($ arg1,arg2美元){
返回新的DB($美元arg1,arg2);
});
集装箱->绑定美元('session功能($ arg1,arg2美元){
返回新的会话($美元arg1,arg2);
});
集装箱->绑定美元('fs功能($ arg1,arg2美元){
返回新的文件系统($美元arg1,arg2);
});
容器的依赖
一流作家{
保护_db美元;
保护_filesystem美元;
保护_session美元;
受保护的容器;
公共函数编写器(容器$容器){
美元-> _db = $容器->使('db,{1,2});
美元-> _filesystem = $容器->使('session,{,});
美元-> _session = $容器->使('fs,{ 5,6 });
}
}
$作者=新作者($容器);
以上是本文的全部内容,希望本文的内容能给大家的学习或工作带来一定的帮助,同时也希望能给予更多的支持
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部