抽象类:
抽象类也是面向对象中的重要概念,和接口、继承的概念重要性相当,在面向对象的开发中,所有的对象都是通过类来描述的,但是反过来,并不是所有类都是用来描绘对象的,广义上讲如果一个类中没有足够信息来描述一个具体的对象,这样的类就是抽象类。具体用简单的代码来实现:
abstract class ACanEat {
// 抽象方法需要在子类中实现
abstract public function eat($food);
public function breath(){
echo "Breath use the air.<br />";
}
}
// Human类继承了ACanEat抽象类
class Human extends ACanEat {
// 跟Animal类的实现是不同的
public function eat($food){
echo "Human eating " . $food . "\n";
}
}
// Animal类继承了ACanEat抽象类
class Animal extends ACanEat {
public function eat($food){
echo "Animal eating " . $food . "\n";
}
}
$man = new Human();
$man->eat("Apple");
$man->breath(); // 和Animal共用了抽象类ACanEat的breath方法
$monkey = new Animal();
$monkey->eat("Banana");
$monkey->breath();
从代码可以简单的看出,抽象类定义前面以abstract关键字开始,里面可以定义多个方法,可以具体实现,也可以定义为抽象方法,没有实现的方法需要设定为抽象方法,需要在最前面加abstract关键字,抽象方法需要在子类中实现,而普通方法子类可以不用重写,对象可以直接使用。
上面代码中,Human类和Animal类都继承了ACanEat抽象类,通过各自不同的方法实现了eat,但是两个类继承了相同的方法breath,这个属性可以认为是相同的,无论实例化哪个对象都可以使用相同的breath方法
所以,抽象类其实就是介于普通类和接口之间的一个类,普通类需要实现所有方法,接口所有方法都不需要实现,而抽象类可以根据自己的需要去选择实现部分方法;但是一旦类里面有抽象方法,这个类就必须是抽象类,另外注意,抽象类跟接口一样,不能直接实例化为对象,只能被普通类继承,,其实抽象类同样体现了面向对象的多态现象。
接口:
先说一说php接口类的特点:
1,接口的方法必须是公开的,
2,接口的方法模式是抽象的,不需要在方法名的前面加abstract
3,接口可以定义常亮,但是不可以定义成员的属性,常亮的定义和用法和类中的常亮是一样的
4,类中可以实现多个接口
5,接口类可以继承接口类(支持多重继承)
php同大多数的面向对象的语言一样,并不支持多重的继承,如果需要实现多重继承的功能,在php
中可以使用接口解决多重继承问题。在php版本5.4之后有个类的新特性是trait,可以了解一下:
https://www.jb51.net/article/81883.htm
接口的思想是指定一个实现了该接口类的继承就必须去实现类中的一系列函数,如果没有实现接口的
指定的方法(可以理解为抽象方法),将产生一个致命错误。
当有很多人一起开发一个项目时,可能都会去调用别人写的一些类,那你就会问,我怎么知道他的某个功能的实现方法是怎么命名的呢,这个时候PHP接口类interface就起到作用了,当我们定义了一个接口类时,它里面的方式是下面的子类必须实现的,比如 :
<?php interface Shop{ public function buy($id); public function sell($id); public function view($id); } class shopman implements Shop{ public function buy($id) { echo '我想买'."$id"; } public function sell($id) { echo '你要卖'."$id"; } public function view($id) { echo '给我看看'."$id"; } } $obj = new shopman(); $obj->buy('笔记本'); echo '<br/>'; $obj->sell('笔记本'); echo '<br/>'; $obj->view('笔记本'); ?>
我声明一个shop接口类,定义了三个方法:买(buy),卖(sell),看(view),那么继承此类的所有子类都必须实现这3个方法少一个都不行,如果子类没有实现这些话,就无法运行。实际上接口类说白了,就是一个类的模板,一个类的规定,如果你属于这类,你就必须遵循我的规定,少一个都不行,但是具体你怎么去做,我不管,那是你的事。
接口类与抽象类的区别:
1,抽象类以abstract定义,使用extends被子类继承。接口类使用interface定义,使用implements被子类继承
2,抽象的方法在子类中根据自己需求实现部分方法,普通方法可以重写,也可以直接使用。
接口类中的方法需要全部实现,遵循接口的规则。
3,接口类没有构造函数,抽象类有构造函数
4,接口中的方法默认为public,抽象类中的方法可以用public,protected,private修饰。
有什么缺少的还需要各位补充补充!