(Recommended tutorial: PHP video tutorial)
Inversion of control is a The idea is a design pattern that can reduce coupling.
For example
<?php class A{ public function getClassName(){ echo '我是class A'; } } class B{ public $test; public function __construct() { $this->test = new A(); //在类的内部获取依赖的对象。 //把依赖的对象写死在 Class B 中,由 Class B 选择依赖的对象,这叫做控制正转。 } } $b = new B(); $b->test->getClassName();
//Output I am class A
The constructor of class B depends on class A. If the dependent class (class A) is Written in the constructor of class B, this way of writing is very highly coupled.
For example, if class A is renamed, we have to modify the code of class B.
If class B does not require class A but class C, we have to modify the code of class B.
In order to solve this problem, we can use the inversion of control design pattern.
<?php class A{ public function getClassName(){ echo '我是class A'; } } class B{ public $test; public function __construct($obj) { $this->test = $obj; //不在类的内部写死依赖的对象,而是通过外部以参数的形式传入依赖的对象,这叫控制反转。 } } $b = new B (new A()); //注入 class A 的实例 $b->test->getClassName();
After modifying the code in this way, the above two problems are better solved.
If class A is renamed, we do not need to modify the code of class B, we only need to modify the parameters passed into the constructor of class B.
If class B does not require class A and class C is required, we do not need to modify the code of class B, we only need to modify the parameters passed into the constructor of class B.
Do not write the dependent class (class A) in the constructor of class B. Instead, when instantiating Class B, pass the dependent class (class A) into the class from the outside in the form of a parameter. In the constructor of class B, when we don't need class A, we only need to modify the parameters passed into the constructor of class B without modifying the code of class B, which greatly reduces the coupling.
In fact, in human language, don’t instantiate the class in the method, but pass the object into the method by passing parameters to the method.
At this point, class B has changed from actively selecting dependencies to passively receiving dependencies from the outside. The method of obtaining dependent objects has been reversed. This is inversion of control.
Dependency injection
Dependency injection has already appeared in the above code
$b = new B (new A()); // class B 的构造方法需要一个对象 //注入 class A 的实例
The relationship between inversion of control and dependency injection can be summarized in one sentence. Dependency injection can be used to achieve inversion of control.
(Recommended tutorial:
PHP video tutorialThe above is the detailed content of Introduction to the Implementation of PHP Inversion of Control and Dependency Injection. For more information, please follow other related articles on the PHP Chinese website!