一、抽象类
抽象类是父类的模板。一个抽象类定义了接口:这个基类的继承类如何被使用,然后子类再真正实现这些接口。抽象类就是被用来扩展的,然后才可以创建这些派生类的实例,换而言之,抽象类就是被用来继承的。
在子类中实现继承来的抽象方法时,其可见性必需高于或等于抽象方法定义的可见性。同时,方法的实现版本要和抽象方法的参数数目一样(函数签名一致)。
如果一个类哪怕只有一个抽象方法,那么这个类本身就应该是抽象类。然而,一个抽象类可以没有抽象方法,和属性一样,抽象方法需要被子类继承。
示例程序:
abstract class Shape {
abstract protected function getPerimeter();
abstract protected function getArea();
}
class Triangle extends Shape {
private $_sides = array();
private $_perimeter = NULL;
function __construct($s0, $s1, $s2) {
$this->_sides[] = $s0;
$this->_sides[] = $s1;
$this->_sides[] = $s2;
$this->_perimeter = array_sum($this->_sides);
}
public function getArea() {
return sqrt(($this->_perimeter / 2) *
(($this->_perimeter / 2) - $this->_sides[0]) *
(($this->_perimeter / 2) - $this->_sides[1]) *
(($this->_perimeter / 2) - $this->_sides[2])
);
}
public function getPerimeter() {
return $this->_perimeter;
}
}
$tri = new Triangle(6, 8 , 10);
echo "三角形面积是:".$tri->getArea().",周长是:".$tri->getPerimeter();
注:可以用海伦公式计算三角形的面积。
在浏览器中运行程序,我们可以看到最终三角形的面积是24,周长是24。
二、接口
接口用来定义必需被特定类定义的功能接口(也就是方法)。如果一个类和一个接口关联,这个类必需定义接口中列出的所有方法。
示例程序:
interface iCrud {
public function create($data);
public function read();
public function update($data);
public function delete();
}
class User implements iCrud {
private $_userId = NULL;
private $_username = NULL;
function __construct($data) {
$this->_userId = uniqid();
$this->_username = $data['username'];
}
function create($data) {
self::__construct($data);
}
function read() {
return array('userId' => $this->_userId, 'username' => $this->_username);
}
function update($data) {
$this->_username = $data['username'];
}
function delete() {
$this->_userId = NULL;
$this->_username = NULL;
}
}
$user = array('username' => 'Tom');
$me = new User($user);
$info = $me->read();
echo "我的Id为:".$info['userId']." ,姓名为:".$info['username']."<br>";
$me->update(array('username' => 'KBen'));
$info = $me->read(); b
echo "修改后,我的Id为:".$info['userId']." ,姓名为:".$info['username']."<br>";
unset($me);
运行结果:
注:uniqid()函数用来创建一个唯一的ID。
总结:
一个抽象类意味着会被扩展为一个特定的类,然后使用扩展类来创建一个对象实例(正是由于继承的关系,如果你在派生类中没有具体实现某一个继承的抽象方法那么将会报错,大致意思为:子类中含有抽象方法,我们必需声明出抽象类或接口中的剩余方法)。抽象类和其子类之间有一个“是一个”的is a关系,如Triangle is a shape。
而接口是建立了一个类需要的方法的合约,而不关心类的类型。