/* * 依赖注入:在java和.net都有一个很典型的框架,叫做“三层架构” * 三层架构: 1.UI(表现层) 【最高层】 * 2.BLL(业务逻辑层) 【第二层】 * 3.DAL(数据访问层) 【第三层】 * 一般来说: 高层模块依赖于低层模块, * 即UI层依赖业务逻辑层, 业务逻辑层依赖于数据访问层 * * 而依赖倒置却相反: 即高层模块不应该依赖于低层模块的实现 * 而是依赖于其抽象(抽象在java中即接口) */
依赖倒置:举例
<?php namespace app\components; use yii\web\IdentityInterface; /* * 依赖注入 Dependency Injection DI * 控制反转 Inversion Of Control IOC * */ class BLL{ public $dal; public function __construct() { $this->dal=Factory::getInstance('db'); } public function getList() { $this->dal->getList(); } } class MysqlDal{ public function getList(){ return ['id'=>1,'name'=>'list']; } } /* * 需求来了,需要将数据库换成Oracle * 1.增加oracle的Dal实现类 * 2.更改我们的BLL代码(业务逻辑层 getList()) */ class OracleDal { public function getList(){ return ['id'=>2,'name'=>'oracle']; } } interface IDb{ public function getList(); } class Mysql implements IDb { public function getList() { return ['id'=>2,'name'=>'oracle']; } } class Oracle implements IDb { public function getList() { return ['id'=>1,'name'=>'list']; } } class factory { public static function getInstance($name){ /* * System FileStream * 在强类型语言中,这里需要使用反射技术来创建该类对象 * 反射相比于new会有一点性能损耗,但是是代码级别的, * 相对于代码的扩展和维护性来说 ,这点牺牲是值得的 * spring有两个工厂,一个是对象已经创建好了,另一个是用到的时候在创建 * php就是用到的时候在创建 */ return new $name; } }