日期:2014-05-17  浏览次数:20463 次

PHP聚合耦合???
这是一个通用模型接口:
PHP code
interface API{
  public function main();
  public function params($value);
}

然后,一般模型类继承它:
PHP code
class test implements API {
  public function main(){
    echo 'hello world!';
}
  public function params($value){
   var_dump($value);
}
}

前端控制器,解析了URL后实例化模型类,调用接口,传递模型数据:
PHP code
class Control{
private function __construct(){
  self::Router();
  $obj = new self::$Model();
  self::_Interface($obj);
}

public static _Interface(API $obj){
  $obj -> main();
  $obj -> params();
}
}



这是我做的简单的耦合结构,但是,这只是相对于控制器和模型类之间的耦合,而且是通用类,如果是特殊类还得使用特殊的接口和控制器,但问题不在这,问题在于我想让模型之间也通过接口交互(数据耦合?),但是想了很多也没有实际的解决办法,该怎样做这个接口呢???
比如,我需要调用一个数据库类的函数,一般情况下是直接调用:
  $db = db::main();
  #db -> Query(***********************);
但是,这不符合低耦合概念,我只要一改Query();方法就完蛋了,有什么办法能拉取数据??
或者说,给个数据耦合的实例也行,自己慢慢研究算了....
谢谢啦!
(注:我知道,可能会有人说上面的代码不过完善什么的?的确,我是把前端控制器的一些东西都集成起来了,但这不是我今天讨论的焦点,如果给大家带来了视觉上的不便,请见谅)

------解决方案--------------------
说是实话非常不明白你到底要做什么。。。

但是数据层要交互的话,明显应该通过控制层来做,否则要控制层做什么?因为只有控制层知道数据之间有什么具体业务逻辑上的关系,而model仅仅应该关心的是自己的一亩三分地,超出这个范围之外的都应该交给上层处理,这样才是降低了耦合!

另外提到的$db->query的问题,明显可以通过抽离字段、条件、排序等,将query转换成

$db->select()->where()->order()->limit()

下面有2种方式:

1 然后接着抽象

$db::fetch($where, $order, $limit) {
 return $db->select('*')->where($where)->order()->limit();

}

调用的时候

$db = db::main();
$db->fetch($where, $order, $limit);

2 或者可以封装一个底层的model基类

basemodel::fetch($where, $order, $limit) {
$db = db::main();
 return $db->select('*')->where($where)->order()->limit();

}

模型基础
class test extends basemodel implements API { 
function dothing(){
parent::fetch($where, $order, $limit);
}
}

没有明白这个和数据耦合有什么关系,这仅仅是调用db的封装!
------解决方案--------------------
2楼得说的有理,我个人认为降低耦合的办法就是显示层只负责显示,逻辑处理就交个业务逻辑层,数据访问层只管处理数据,个做个的事!
关于数据库类得问题,我建议你去看看uchome的数据库类,我觉得他的类写得还不错,跟2楼说的比较相似!
------解决方案--------------------
既然是控制器的基类。控制器不都可以遵循基类提供的标准执行数据?
------解决方案--------------------
我以为你应经被各种名词带入到一个误区了
你实际上是想在各个功能模块间传递某中信息
其实这是很容易实现的一种机制,就是操作系统中广泛使用的事件驱动或消息驱动
一个模块将自己的需求广播出去,能够实现此需求的模块就此需求返回需要的数据