这是一个通用模型接口:
interface API{
  public function main();
  public function params($value);
}
然后,一般模型类继承它:
class test implements API {
  public function main(){
    echo 'hello world!';
}
  public function params($value){
   var_dump($value);
}
}
前端控制器,解析了URL后实例化模型类,调用接口,传递模型数据:
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();方法就完蛋了,有什么办法能拉取数据??
或者说,给个数据耦合的实例也行,自己慢慢研究算了....
谢谢啦!
(注:我知道,可能会有人说上面的代码不过完善什么的?的确,我是把前端控制器的一些东西都集成起来了,但这不是我今天讨论的焦点,如果给大家带来了视觉上的不便,请见谅)

解决方案 »

  1.   

    说是实话非常不明白你到底要做什么但是数据层要交互的话,明显应该通过控制层来做,否则要控制层做什么?因为只有控制层知道数据之间有什么具体业务逻辑上的关系,而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.   

    2楼得说的有理,我个人认为降低耦合的办法就是显示层只负责显示,逻辑处理就交个业务逻辑层,数据访问层只管处理数据,个做个的事!
      关于数据库类得问题,我建议你去看看uchome的数据库类,我觉得他的类写得还不错,跟2楼说的比较相似!
      

  3.   

    控制器可以实现模型类的耦合,实现接口,但是模型类与模型类之间的数据通讯可以实现接口耦合吗?就像__Autoload();自行判断模型类并且返回数据供模型类调用…
    额,都不知道自己在说什么了…
      

  4.   

    嗯,大大说的有理,的确,在提出问题前查了很多资料,庞大的信息流将我的思维混乱了,我不太会组织语言,于是出现很多的错误,抱歉!
    我的想法是希望通过某一种标准(应该是标准吧?),让所有的模型类(或者说是带有返回参数的模型类)来继承它,然后,可能我在此模块中需要彼模块的一些返回值作为这个模块的参数之一参与运算.
    比如:我有一个login模块,我需要验证用户正确信息便需要调用db类,我不想直接$db -> Query();我希望的是如果能使用如:$fun::fun('db','query','');这样的方法来返回数据,因为,我可能还需要使用到gd类来执行验证图片生成,于是我便$fun::fun('gd','create',mt_rand());所有的操作都不直接使用原有的类名和函数名,而是使用这个标准来传递和返回数据....
    我原本是想做一个接口,然后定义一个函数来规范,但是,我发现这样做并不能保证每个模型都适用,因为函数的操作参数多种多样,返回值也是,我能将操作和参数标准化却不能保证将返回值也标准化,这样就失去了这个模型该有的作用了....
    不知道该怎么做才是.....????
    2楼的大大辛苦了,难为还能写出这么多,好像,使用DB基类封装可以降低耦合,好吧,再好好消化一下,看看是否可以将它扩展成为一个通用的标准应用于我的模型类中....
    呵呵....
    再次感谢!!!