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();
}
}
class 人 extends 汽车 {} //这就太不好了
|