Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2772418
  • 博文数量: 77
  • 博客积分: 10204
  • 博客等级: 上将
  • 技术积分: 5035
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-05 22:13
文章分类
文章存档

2013年(1)

2010年(1)

2009年(17)

2008年(58)

我的朋友

分类:

2009-04-19 20:10:22

class DB
{

}

class Student
{
    public function getAllStudent()
    {
        
    }
}

DB 数据库类, Student学生类,因为Student需要从数据库当中读取学生列表,所以这里需要使用到DB类

再写下去有些朋友可能会这样:

class Student extends DB
{
    //我有操作DB库的能力了.
}

在这里 Student 与 DB 基本上没有什么关系,根本谈不上什么is-a的关系,不管这两个家伙谁继承谁都

完全的没有道理,那么在这里只是Student'需要'用到DB库.这里可以应用"聚合/包含"的概念

例如:

class Student {
    private $DB; //Student类中包含了DB.这样做在Student当中也完全拥用了DB的功能,同样实现了代码重用.
    public function __construct($DB)
    {
        $this->DB = $DB;
    }
    /**
     * 也可以这样
    */
    public function __construct()
    {
        require("数据库配置信息.php");
        $this->DB = new DB($host, $user,.....);
    }
}

其实在很多情况下继承都被乱用了,类似这样不合理的代码看到了很多.以前自己也有犯这样的错误.甚用继承.在使用

这种功能的情况下,考虑一下他们之间是不是有IS-A的关系.很简单不是吗?

再来一个小例子.

class 汽车
{
    public run()
    {
        echo "汽车跑起来了.";
    }
}
class
{
    //人要开车,车不会自已发动...
}

以上程序如何做?

class
{
    private 汽车;
    public function __construct($汽车)
    {
        $this->汽车 = $汽车;
    }
    public function 我开车了()
    {
        $this->汽车->run();
    }
}
classextends 汽车 {} //这就太不好了

阅读(1188) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~