企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## **abstract 抽象类** >[info]抽象类就是定义规则的保持子类行为统一  抽象类特点:     * 1.抽象类是指在class前加了abstract关键字且存在抽象方法(在类方法function关键字前加了abstract关键字)的类。 * 2.抽象类不能被直接实例化。抽象类中只定义(或部分实现)子类需要的方法。子类可以通过继承抽象类并通过实现抽象类中的所有抽象方法,使抽象类具体化。 * 3.如果子类需要实例化,前提是它实现了抽象类中的所有抽象方法。如果子类没有全部实现抽象类中的所有抽象方法,那么该子类还是一个抽象类,必须在class前面加上abstract关键字,并且不能被实例化。**子类继承**抽象类,就必须**定义(相当于重写)实现**抽象类中的方法;即抽象父类中带有abstract的方法必须被子类继承,否则子类还是抽象类,也不能实例化 * 4:可以定义属性、方法、抽象方法 * 5:抽象方法没有方法体(即无花括号)abstract public function eat(); * 6:抽象类不能实例化只能被子类继承调用  定义了抽象类,就是让你子类继承,实现具体的抽象方法 * 7:抽象类中可以没有抽象方法,但是有抽象方法的类必须定义为抽象类 例子1: ``` abstract class AbstractClass {   // 强制要求子类定义这些方法     abstract protected function getValue();     abstract protected function prefixValue($prefix);     // 普通方法(非抽象方法)     public function printOut() {         print $this\->getValue() . "\\n";     } } class ConcreteClass1 extends AbstractClass {     protected function getValue() {         return "ConcreteClass1";     }     public function prefixValue($prefix) {         return "{$prefix}ConcreteClass1";     } } $class1 = new ConcreteClass1; ``` **列子:2** ``` abstract class Person {     // 属性     public $name = '芙蓉姐姐';     protected $sex = 'Unknown';     private $age = 18;     public function say()     {         echo '上课了,就不要睡觉觉了';     }     // 抽象方法     abstract public function eat();//1抽象方法无花括号;2抽象类可以没有抽象方法只要Person类前加了abstract不要这行代码也是抽象类 } // 实例化Person类 $p = new Person; // Cannot instantiate(实例化) abstract class Person 不能被实例化 class girl extends Person{  public function eat(){    echo'吃东西吃出大姨妈了';  } }  $pp=new girl(); var_dump($pp);//object(girl)#1 (3) { ["name"]=> string(12) "芙蓉姐姐" ["sex":protected]=> string(7) "Unknown" ["age":"Person":private]=> int(18) } $pp->say();上课了,就不要睡觉觉了' $pp->eat();//吃东西吃出大姨妈了 ``` php7.2起,当一个抽象类继承于另外一个抽象类的时候,继承后的抽象类可以重写被继承的抽象类的抽象方法 ~~~ abstract class A { abstract function test(string $s); } abstract class B extends A { // 覆盖 - still maintaining contravariance for parameters and covariance for return abstract function test($s) : int; } ~~~