容器注入和门面Facade
程序员文章站
2023-12-28 08:32:40
...
思想:以用户登录案例为例,工作类调用三个基本的工具类会出现严重藕合现象,一旦工具类发生变化,工作类就必须对应的更改设置;对工具类的实例化不要在工作类中完成,在(类或函数之外完成)客户端完成,这样必须在工作类中必须要有一个接收器来保存工具类的实例,将工作类依赖的对象以方法参数的方式植入到当前的类中,叫依赖注入。但依赖注入还是要在工作类的客户端进行实例化,怎么能去掉实例化?给出一个类名以及如何去实例化衍生出来了容器注入。
代码实现,创建三个工具类
class Db { public function connect() { return 'Db连接成功<br>'; } } class Validate { public function check() { return '数据验证成功<br>'; } } class View { public function display() { return '用户登录成功<br>'; } }
容器注入基本步骤:
1,创建容器:将一个类和他的关联实现绑定到一个关联数组中
class Container { //创建一个空数组用来保存工具类及实现方法 // protected $instance = []; //创建一个属性 public $instance = []; // $instance['类名'] = '类的实例化过程\函数'; //将需要实例化的类和它的实现方法进行绑定:降对象容器进行初始化 public function bind($abstract,Closure $process) { $this->instance[$abstract] = $process; // $this->instance['db'] = function(){ // return new Db('locahost','root','root'); } //创建特定类的实例 public function make($abstract,$params=[]) { return call_user_func_array($this->instance[$abstract],[]); } }
2,服务注册:初始化这个关联数组,将工具类绑定到容器中
//2,服务注册:其实就是调用容器的bind方法,将对象注册到容器中 $container = new Container(); //将Db类绑定到容器中 $container->bind('db',function(){ return new Db(); }); $container->bind('validate',function(){ return new Validate(); }); $container->bind('view',function(){ return new View(); });
3,容器依赖:也叫依赖容器,调用的时候直接传一个容器对象即可
// 用户类:工作类 class User { public function login(Container $container) { //$container->make('db'):实例化Db类创建$db对象 echo $container->make('db')->connect(); echo $container->make('validate')->check(); echo $container->make('view')->display(); } } $user = new User(); echo '<h3>用依赖容器来实现解藕</h3>'; echo $user->login($container);
门面Facade:
思想:将一些操作进行封装,对外提供统一接口进行访问,跟网址大全hao123差不多,
Facade类实现三个功能:1,连接数据库; 2,数据验证;3,输出提示
require 'container.php'; class Facade { //创建一个静态属性保存容器对象 protected static $container = null; //创建一个初始化方法,给容器对象赋值 public static function initialize(Container $container) { static::$container = $container; } //1,连接数据库 public static function connect() { return static::$container->make('db')->connect(); } //2,数据验证 public static function check() { return static::$container->make('validate')->check(); } //3,输出提示 public static function display() { return static::$container->make('view')->display(); } } //客户端调用 echo '<h3>简化后的Facade门面统一调用:</h3>'; Facade::initialize($container);//初始化 echo Facade::connect($container); echo Facade::check($container); echo Facade::display($container);