db类
class Db{ protected $content=null; public function __construct($config) { $dns = $config['type'].':host='.$config['host'].';dbname='.$config['dbname'].';charset='.$config['charset']; $pdo=new PDO($dns,$config['uname'],$config['pwd']); $this->content = $pdo; } public function lanjie(){ echo '数据库连接成功'; } }
validate 类
class Validate{ public function vali(){ return '验证成功'; } }
view 类
class View{ public function jump(){ return '跳转到首页了'; } }
container类
require 'Db.php'; require 'Validate.php'; require 'View.php'; class Container{ //创建一个空数组来保存工具类及实现方法 protected $instance=[]; //将需要实例化的类与它的实现方法进行绑定;将对象容器实例化 public function bind($abstract,Closure $process){ $this->instance[$abstract]=$process; } //创建特定类的实例 public function make($abstract,$params=[]){ return call_user_func_array($this->instance[$abstract],$params); } } $container = new Container(); ////绑定db类 $config=['type'=>'mysql','host'=>'127.0.0.1','dbname'=>'test','charset'=>'utf8','uname'=>'root','pwd'=>'root']; //绑定db $container->bind('Db',function ()use($config){ return new Db($config); }); //绑定验证类 $container->bind('Validate',function (){ return new Validate(); }); //绑定视图类 $container->bind('View',function (){ return new View(); });
facde 类
require 'Container.php'; class Facde{ protected static $container =null; public static function initialize(Container $container){ static::$container=$container; } //连接数据库 public static function content(){ return static::$container->make('Db',[])->lanjie(); } //验证 public static function Validate(){ return static::$container->make('Validate')->vali(); } //试图 public static function View(){ return static::$container->make('View')->jump(); } } echo "<h1>使用facde</h1>"; Facde::initialize($container); echo Facde::content(),'<br>'; echo Facde::Validate(),'<br>'; echo Facde::View(),'<br>';
效果图:
总结:先把单独的工具类放入 容器中,事先绑定。然后在 门脸类中用一个静态属性来保存容器类的实例 ,然后 使用一个初始化方法 依赖注入 容 器类, 门脸类中的 静态方法就是工具类的方法。这样就能引入 门脸类后直接静态调用了