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.抽象类继承抽象类,子抽象类可以对父抽象类的抽象方法实现或者不实现,但是不能将父类的抽象方法重新声明。