💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
abstract 抽象类: 类成员方法中至少有一个被声明为抽象(abstract),被声明的方法只有定义没有实现,访问权限不能声明为private,可以声明属性和类常量,不能被实例化,只能被其他类继承或实现的特殊类. \[此定义是个人理解,其中"类成员方法中至少有一个被声明为抽象"这句在代码上看是有问题的,可见以下代码实验的第二条,但抽象类的意义是通过抽象方法来规范子类,如果一个抽象方法都没有,就达不到这个要求,与普通class无异,与目的相违背,因此定义我依然不改,但要知道这个现象\] **1.抽象类中没有被声明为抽象的方法必须要实现** ~~~ <?php //错误示例: 非抽象方法没有实现 abstract class mp3 {   public function music(); } ~~~ ( ! ) Fatal error: Non-abstract method mp3::music() must contain body in F:\\wamp\\www\\blog.54skyer.cn\\index.php on line 79 **2.抽象类中至少有一个方法被声明为抽象.\[事实证明该定义错误,见代码\]** ~~~ <?php abstract class mp3 {     public function music(){         echo "mp3 play a music";     } } ~~~ !!!执行没有任何报错,证明抽象类还真的可以没有任何抽象方法.即抽象类中至少有一个方法被声明为抽象是必要不充分条件,个人认为是PHP代码设计的检测缺陷.但是如果一个类里面包含了抽象方法,则类必须被声明为抽象 **3.被声明为abstract(抽象)的方法只有定义,没有实现** ~~~ <?php //错误示例: 方法进行了实现 abstract class mp3 {     public abstract function music(){         echo "mp3 play a music";     } } ~~~ ( ! ) Fatal error: Abstract function mp3::music() cannot contain body in F:\\wamp\\www\\blog.54skyer.cn\\index.php on line 81 ~~~ <?php //正确示例: 只有定义,没有实现 abstract class mp3 {     public abstract function music(); } ~~~ **4.抽象方法访问权限不能被声明为private(私有),因为抽象方法必须被子类继承或实现,private不满足** ~~~ <?php //错误示例: 抽象方法note声明为私有 abstract class mp4 {     protected abstract function vedio();     public abstract function music();     private function note(); } ~~~ ( ! ) Fatal error: Abstract function mp4::note() cannot be declared private in F:\\wamp\\www\\blog.54skyer.cn\\index.php on line 81 **5.可以声明类常量和属性,子类覆写父类的属性和方法时,访问权限不能比父类更严格,只能相同或者更宽松** ~~~ <?php     abstract class MP3 {         protected abstract function music();     }          class MP4 extends MP3{         private  function music(){     } } $mp4 = new MP4(); $mp4->music(); ~~~ ( ! ) Fatal error: Access level to MP4::music() must be protected (as in class MP3) or weaker in F:\\wamp64\\www\\blog.54skyer.cn\\index.php on line 90 **6.不能被实例化** ~~~ <?php //错误示例: 实例化 abstract class mp3 { public abstract function music(); } $mp3 = new mp3(); ~~~ ( ! ) Fatal error: Cannot instantiate abstract class mp3 in F:\\wamp\\www\\blog.54skyer.cn\\index.php on line 81 **7.普通类继承抽象类必须对其抽象方法进行实现,且实现的抽象方法要取消abstract关键字.** ~~~ <?php //错误示例: 普通子类没有对抽象方法进行实现 abstract class mp3 {     public abstract function music(); } class ipod extends mp3 { } $ipod = new ipod(); $ipod->music(); ~~~ ( ! ) Fatal error: Class ipod contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (mp3::music) in F:\\wamp\\www\\blog.54skyer.cn\\index.php on line 83 ~~~ <?php //正确示例: 普通子类对抽象方法进行实现,且取消abstract关键字 abstract class mp3 {     public abstract function music(); } class ipod extends mp3 {     public function music(){         echo "ipod play a music";     } } $ipod = new ipod(); $ipod->music(); ~~~ **8.抽象类继承抽象类,子抽象类可以对父抽象类的抽象方法实现或者不实现,但是不能将父类的抽象方法重新声明。**