抽象类abstract:
- 抽象类不能被实例化。
- 任何一个类,只要有一个抽象方法,那么就必须声明这个类是抽象类。但是抽象类也可以没有抽象方法。
- 抽象类中的抽象方法不能被实现。
- 一个类继承了抽象方法,则它必须要实现所有的抽象方法。除非它也声明为抽象类。这些的方法的修饰符权限不能小于父类方法的修饰符权限。比如父类是public ,子类就只能是public。父类是protected,子类只能是protected,或者public.
- 一个类只能继承一个父类。
- 如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。
<span style="font-family:Microsoft YaHei;font-size:14px;"><?php
//定义一个动物类,因为有抽象方法,所以必须声明抽象类
abstract class Animal{
public $name;
private $price;
////抽象方法,不能被实现。
abstract public function cry();
//父类构造方法,子类继承,也可以重写覆盖父类构造方法
function __construct($name,$price){
$this->name=$name;
$this->price=$price;
echo "parentClass<br/>";
}
//使用公开方法访问私有属性,普通方法,可以实现
public function getPrice(){
return $this->price;
}
}
//定义猫类,继承动物类
class Cat extends Animal{
//实现父类抽象方法,修饰符只能为public
public function cry(){
echo "miaomiao";
}
}
//实例化猫类,
$cat1=new Cat("mimi",100);
$cat1->cry();
echo "<br/>";
echo $cat1->getPrice();
//定义狗类
class Dog extends Animal{
//覆盖父类构造方法
function __construct($name,$price){
$this->name=$name;
$this->price=$price;
echo "<br/>subClass";
}
public function cry(){
echo "wangwang";
}
}
$dog1=new Dog("wangcai",200);
echo "<br/>";
$dog1->cry();
?>
</span>
打印结果
parent
miaomiao
100
subClass
wangwang
对象接口interface:
- 对象接口是特殊的抽象类,它是一个标准,一个规范。它指定了某个类必须实现哪些方法。
- 接口不能被实例化。
- 所有方法必须是公有,而且不能有方法体。
- 一个类使用接口,就必须要实现这个接口的所有方法。
- 一个类可以实现多个接口,用逗号隔开。实现多个接口时,接口中的方法不能有重名
- 接口可以继承多个接口,而使用这个接口的类必须实现所有接口的方法
- 成员属性,必须是常量(不能有变量)
<span style="font-family:Microsoft YaHei;font-size:14px;"><?php
header("content-type:text/html;charset=utf-8");
interface study{
//定义一个常量,学习时间 常量的调用方法 接口名::常量名
const TIME="1小时";
//接口方法,不能有方法体
public function study($book,$homework);
}
//定义学生类
class Student{
public $name;
private $age;
function __construct($name,$age){
$this->name=$name;
$this->age=$age;
}
}
//定义小学生类,继承学生类,并实现学习方法
class Pupil extends Student implements study {
//必须实现学习方法,方法名与参数列表要与接口方法相同
public function study($book,$homework){
echo "小学生学习课本:".$book;
echo " 小学生家庭作业:".$homework;
//常量的调用方法 接口名::常量名
echo " 学习时间:".study::TIME;
echo "<br/>";
}
}
//定义中学生类,继承学生类,并实现学习方法
class MiddleScoolStudent implements study{
public function study($book,$homework){
echo "中学生学习课本:".$book;
echo " 中学生家庭作业:".$homework;
echo " 学习时间:".study::TIME;
echo "<br/>";
}
}
//实例化小学生
$pupil=new Pupil("小明",10);
$pupil->study("小学语文","写一篇作文");
//实例化中学生
$middStu=new MiddleScoolStudent("李四",15);
$middStu->study("中学英语","背30个单词");
?></span>
小学生学习课本:小学语文 小学生家庭作业:写一篇作文 学习时间:1小时
中学生学习课本:中学英语 中学生家庭作业:背30个单词 学习时间:1小时
继承提高了代码的复用率,降低了冗余度。并且体现了面向对象思想(继承,多态)
接口使代码规范,扩展了类的方法,灵活且不会破会类的层级关系