<?php //定义接口 interface database { public function connect($param); //定义接口方法 public function query($sql); //定义接口方法 public function fetch($query); //定义接口方法 } //接口继承 class mysql implements database { //集成上面 connect 的接口 public function connect($param) { echo 'mysql::connect('.$param.')'; } //集成上面 query 的接口 public function query($sql) { echo 'mysql::query('.$sql.')'; } //集成上面 fetch 的接口 public function fetch($query) { echo 'mysql::fetch('.$query.')'; } } //接口继承 class sqlserver implements database { public function connect($param) { echo 'sqlserver::connect('.$param.')'; } public function query($sql) { echo 'sqlserver::query('.$sql.')'; } public function fetch($query) { echo 'sqlserver::fetch('.$query.')'; } } //接口继承 class oracle implements database { public function connect($param) { echo 'oracle::connect('.$param.')'; } public function query($sql) { echo 'oracle::query('.$sql.')'; } public function fetch($query) { echo 'oracle::fetch('.$query.')'; } } class dbfactory { private $objects = array(); private $classes = array(); public function __construct() { $this->classes = array( 'mysql', 'sqlserver', 'oracle' ); for($i=0; $i<count($this->classes); $i++) { if(in_array('database', class_implements($this->classes[$i], false))) { $this->objects[$this->classes[$i]] = new $this->classes[$i]; } else { unset($this->classes[$i]); } } } public function query($sql, $type = 'mysql') { // empty 检测变量对象 $this->objects 是否为空 if(empty($this->objects)) { exit('No class'); } //检测 $this->classes 成员属性数组对象中是否存在 $type 传递过来的值,这里 ! 号 取反,有则 执行 if 外面 if(!in_array($type, $this->classes)) { exit('NO '.$type.' 没有继承接口'); //没有这个值的时候结束当前函数操作并退出 } //下面这句话同等: $object = new mysql(); $object->query($sql); $this->objects[$type]->query($sql); //实例化 类 及调用类里面的方法 } } $factory = new dbfactory(); $factory->query('SELECT * FROM member', 'mysql'); echo '<hr/>'; $factory->query('SELECT * FROM member', 'sqlserver'); echo '<hr/>'; $factory->query('SELECT * FROM member', 'oracle'); ?>
发表评论: