假设有一个小明类,他每天都需要干这三件事。
<?phpclass Ming extends Person{private $_name;private $_age;function read(){//逛}function play(){//玩游戏}function grab(){//抢红包}}
小明是一个人类,他没有办法仅靠自己实现以上功能,他必须依赖一部手机。
<?phpclass iPhone6 extends Iphone{function read($user="某人"){echo $user."打开了记事本 \n";}function play($user="某人"){echo $user."打开了游戏 \n";}function grab($user="某人"){echo $user."开始抢红包 \n";}}
小明直接拥有iphone6,实现以上功能:
<?phpclass Ming extends Person{private $_name;private $_age;public function __construct(){$this->_name = '小明';$this->_age = 26;}function read(){//…… 省略若干代码(new iPhone6())->read($this->_name); //逛}function play(){//…… 省略若干代码(new iPhone6())->play($this->_name);//玩游戏}function grab(){//…… 省略若干代码(new iPhone6())->grab($this->_name);//抢红包}}//具体实现$ming = new Ming(); //实例化小明$ming->read();$ming->play();$ming->grab();
会发现,若小明更换了一个新手机则需要对小明所有方法实现进行修改,所以引入依赖注入的形式修改小明类:
<?phpclass Ming extends Person{private $_name;private $_age;private $_phone; //将手机作为自己的成员变量public function __construct($phone){$this->_name = '小明';$this->_age = 26;$this->_phone = $phone;echo "小明起床了 \n";}function read(){//…… 省略若干代码$this->_phone->read($this->_name); //逛}function play(){//…… 省略若干代码$this->_phone->play($this->_name);//玩游戏}function grab(){//…… 省略若干代码$this->_phone->grab($this->_name);//抢红包}}//具体实现$phone = new Iphone6();$ming = new Ming($phone);//小明不用关心是什么手机,他只要玩就行了。$ming->read();$ming->play();$ming->grab();
现有项目控制器对模型的操作可修改为依赖注入的形式:
<?phpclass BaseController extends Controller{//模型private $model;//接收数据private static $input;//模型具体路径const MODEL_ROUTE = 'app\\models\\';//构造方法public function init(){parent::init();//处理response对象if (empty(static::$input)) {static::$input = input('post.');}//反射模型对象$CLASS_NAME = self::MODEL_ROUTE. parse_name(strtr($this->id, '-', '_'), 1);if (class_exists($CLASS_NAME)) {$this->model = (new \ReflectionClass($CLASS_NAME))->newInstanceArgs([static::$input]);}}/*** 查询列表数据(含分页)* @return array*/public function actionList(): array{return $this->model->getLists();}/*** 查询数据详情* @return array*/public function actionRead(): array{return $this->model->getOne();}/*** 创建数据* @return array*/public function actionCreate(): array{return $this->model->addOne();}/*** 更新数据* @return array*/public function actionUpdate(): array{return $this->model->editOne();}}
