抽象类是一种不能被实例化的类,只能作为其他类的父类来使用。抽象类使用abstract关键字来声明。
格式为:
abstract class AbstractName{
...
}
抽象类和普通类相似,都包含成员变量和成员方法。两者的区别在于:抽象类至少要包含一个抽象方法。抽象方法没有方法体,其功能的实现只能在子类中完成。抽象方法也是使用abstract关键字来修饰的,格式为:
abstract function abstractName();
注意:在抽象方法后面要有分号。
抽象类和抽象方法主要应用于复杂的层次关系中,这种层次关系要求每一个子类都包含并重写某些特定的方法。
例如:中国美食是多种多样的,有粤菜、鲁菜、川菜、湘菜等菜系。每种菜系使用的都是煎、炒、烹、炸等手法,只是在具体步骤上各有不同。如果把中国美食当做一个大类cate,下面的各大菜系就是Cate的子类,而煎炒烹炸则是每个类中都有的方法。每个方法在子类中的实现都是不同的,在父类中无法规定。为了统一规范,不同子类的方法要有一个相同的方法名:decoct(煎)、stir_fry(炒)、cook(烹)、fry(炸)
例如:实现一个商品的抽象类MyObject,该抽象类包含一个抽象方法service()。为抽象类生成两个子类MyBook和MyComputer,分别在两个子类中实现抽象方法。最后实例化两个对象,调用实现后的抽象方法,输出结果。
<?php
/*抽象类MyObject*/
abstract class MyObject
{
/*抽象方法service*/
abstract function service($getName,$price,$num);
}
/*声明抽象类的子类*/
class MyBook extends MyObject{
/*实现抽象方法*/
function service($getName, $price, $num)
{
// TODO: Implement service() method.
echo "您购买的商品是".$getName.",该商品的价格是: ".$price." 元。";
echo "您购买的数量:".$num." 本。";
echo "如发现缺页、损坏请及时更换";
}
}
class MyComputer extends MyObject
{
function service($getName, $price, $num)
{
// TODO: Implement service() method.
echo "您购买的商品是".$getName.",该商品的价格是: ".$price." 元。";
echo "您购买的数量:".$num." 台。";
echo "如发质量问题请在三个月内及时更换";
}
}
$book = new MyBook();
$computer = new MyComputer();
$book -> service("<PHP从入门到精通>",85,3);
echo "<br>";
$computer -> service("联想笔记本",5000,1);
运行结果为:
您购买的商品是
,该商品的价格是: 85 元。您购买的数量:3 本。如发现缺页、损坏请及时更换
您购买的商品是联想笔记本,该商品的价格是: 5000 元。您购买的数量:1 台。如发质量问题请在三个月内及时更换
您购买的商品是联想笔记本,该商品的价格是: 5000 元。您购买的数量:1 台。如发质量问题请在三个月内及时更换