- abstract属于类的修饰符。
- 当abstract修饰某个类时,该类被定义为抽象类。
- 抽象类不能被实例化,只能被继承。
- 抽象类中的方法可以有抽象方法,也可以有有结构体的普通方法。抽象方法为没有函数体的方法。
- 抽象类中的抽象方法用abstract修饰,interface中的抽象方法是用public修饰。抽象方法不能使用
private
修饰,因为该修饰方法就是为了让子类去重写实现的,可以为public和protected修饰。 - 抽象类中不一定有abstract的抽象方法,但有abstract的抽象方法的类肯定是抽象类或者是trait。抽象类内可以有普通类中的所有属性。
- 子类如果继承了一个抽象类,则子类必须实现抽象类中的所有抽象方法,和interface类似。
- 如果不实现父类中的抽象方法,那么子类也必须是抽象类
abstract class MyClass {
abstract public function abstractFunc();
abstract public function abstractFuncOther();
public function index() {
}
}
abstract class SubAbstract extends MyClass {
//不实现父抽象类的抽象方法则自身必须为抽象类
}
抽象类和接口的使用场景
首先明确接口里的所有方法都是抽象方法,而抽象类中是可以定义有方法体的普通方法的。
由此可知:如果子类与子类之间完全没有关系,都是互相独立的,例如实现mysql类和redis类,俩个子类实现各自的接口即可。
而某些场合下,子类与子类之间是有关系的,只靠纯粹的接口是不能满足类与类之间协调
的,此时这些子类就可以继承同一个抽象类,在该抽象类中的非抽象方法内实现相关子类的协调操作。
还有一种场合:子类与子类之间有一些共同点的,也有一些不同点(不同的子类实现的方法逻辑不一样),此时子类就可以继承同一个抽象类,在抽象类中的非抽象方法中实现子类之间的共同操作,而子类在继承了抽象类的抽象方法中实现属于自己的逻辑。
注意
trait内也是可以有abstract方法的。use了该trait的类必须实现trait内的抽象方法
<?php
namespace App\learn;
trait CsvTrait
{
public function export(){
//导出相关操作
return 2;
}
abstract function ff();
}
调用CsvTrait
<?php
namespace App\learn;
class Csv
{
use CsvTrait;
public function ff(){
return 22;
}
}
网友评论