抽象类和接口都是特殊的类,因为它们都不能被实例化。抽象类只能作为父类使用,因为抽象类不能被实例化。
抽象类使用关键字abstract声明。语法格式如下:
abstract class 抽象类名称 {
//抽象类的成员变量列表
abstract function 成员方法1(参数); //抽象类的成员方法
abstract function 成员方法2(参数); //抽象方法必须使用关键字abstract来修饰,抽象方法后必须有分号。
}
抽象类和普通类的主要区别:
-
抽象类的方法没有方法内容
-
至少包含一个抽象方法
有抽象方法的一定是抽象类;抽象类可以不包含抽象方法。
例1:
abstract class MyObject{
abstract function service($getName,$price,$num); //抽象类的成员方法
}
class MyBook extends MyObject{
function service($getName,$price,$num){
echo '购买的商品是'.$getName.',商品的价格是:'.$price.' 元。';
echo '您购买的数量为:'.$num.' 本。';
}
}
class MyComputer extends MyObject{ //继承抽象类
function service($getName,$price,$num){
echo '您购买的商品是'.$getName.',该商品的价格是:'.$price.' 元。';
echo '您购买的数量为:'.$num.' 本。';
}
}
$book = new MyBook();
$computer = new MyComputer();
$book -> service('book1',59,15);
echo '<p>';
$computer -> service('book2',65,10);
例2:
//子类必须实现抽象类的所有方法吗? 答:是的,否则会报错
abstract class MyObject1{
abstract function service1($getName,$price,$num); //抽象类的成员方法
abstract function service2($getName,$price,$num);
}
class MyBook1 extends MyObject1{
function service1($getName,$price,$num){
echo '购买的商品是'.$getName.',商品的价格是:'.$price.' 元。'.'<br>';
echo '您购买的数量为:'.$num.' 本。'.'<br>';
}
function service2($getName,$price,$num){
echo '购买的商品是'.$getName.',商品的价格是:'.$price.' 元。'.'<br>';
echo '您购买的数量为:'.$num.' 本。'.'<br>';
}
}
$book1 = new MyBook1();
$book1 -> service1('book1',59,15);
$book1 -> service2('book2',59,15);