抽象类里的方法可以有方法体,只有抽象方法才不能拥有方法体。接口中的方法一定为抽象方法没有方法体,抽象类中的抽象方法才有方法体,但并不全为抽象方法。接口中虽然全部都为抽象方法,不可以定义属性,但是也可以定义常量。
可以使用abstract来修饰一个类或者方法。
用abstract修饰的类表示这个类是一个抽象类,用abstract修饰的方法表示这个方法是一个抽象方法。
抽象类不能被实例化。
抽象方法是只有方法声明,而没有方法的实现内容。
abstract 抽象类
可以使用abstract来修饰一个类。
用abstract修饰的类表示这个类是一个抽象类。
抽象类不能被实例化。
这是一个简单抽象的方法,如果它被直接实例化,系统会报错。
1 2 3 4 5 6 7 8 9 10 11 12
| <?<a href = "http://lib.csdn.net/base/php"class = 'replace_word' title = "PHP知识库" target = '_blank' style = 'color:#df3434; font-weight:bold;'>PHP</a> //定义一个抽象类 abstract class User { public function __toString() { return get_class($this); } }
echonew User(); ?>
|
下面例子的 NormalUser 继承自 User类,就可以被实例化了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <?<a href = "http://lib.csdn.net/base/php"class = 'replace_word' title = "PHP知识库" target = '_blank' style = 'color:#df3434; font-weight:bold;'>php</a> //定义一个抽象类 abstract class User { public function __toString() { return get_class($this); } }
echonew User(); class NormalUser extends User { } $a = new NormalUser(); echo"这个类" . $a . "的实例"; ?>
|
单独设置一个抽象类是没有意义的,只有有了抽象方法,抽象类才有了血肉。下面介绍抽象方法。
abstract 抽象方法
用abstract修饰的类表示这个方法是一个抽象方法。
抽象方法,只有方法的声明部分,没有方法体。
抽象方法没有 {},而采用 ; 结束。
一个类中,只要有一个抽象方法,这个类必须被声明为抽象类。
抽象方法在子类中必须被重写。
下面是一个抽象类,其中有两个抽象方法,分别是 setSal() 和 getSal()。用来取回 $sal 员工的工资。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <?php abstract class User { protected$sal = 0; 号。 abstract function getSal(); abstract function setSal(); public function __toString() { return get_class($this); } } ?>
|
既然User类不能被直接继承,我们写一个NormalUser类继承自User类。当我们写成如下代码时,系统会报错。 这个错误告诉我们,在 User类中有两个抽象方法,我们必须在子类中重写这两个方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <?php abstract class User { protected$sal = 0; 号。 abstract function getSal(); abstract function setSal(); public function __toString() { return get_class($this); } } class NormalUser extends User { } ?>
|
下面例子,重写了这两个方法,虽然方法体里面 {} 的内容是空的,也算重写了这个方法。注意看重写方法的参数名称,这里只要参数数量一致就可以,不要求参数的名称必须一致。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| <?php abstract class User { protected$sal = 0; abstract function getSal(); abstract function setSal(); public function __toString() { return get_class($this); } } class NormalUser extends User { function getSal() { } function setSal($sal) { } }
?>
|
下面19-21行,三种写重写的方式都会报错。
19行,缺少参数。
20行,参数又多了。
21行,参数类型不对。(这种写法在以后章节介绍)
一个类中,如果有一个抽象方法,这个类必须被声明为抽象类。
下面这个类不是抽象类,其中定义了一个抽象方法,会报错。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <?php class User { protected$sal = 0; abstract function getSal(); abstract function setSal(); public function __toString() { return get_class($this); } }
?>
|
抽象类继承抽象类
抽象类继承另外一个抽象类时,不用重写其中的抽象方法。
抽象类中,不能重写抽象父类的抽象方法。
这样的用法,可以理解为对抽象类的扩展
下面的例子,演示了一个抽象类继承自另外一个抽象类时,不需要重写其中的抽象方法。
1 2 3 4 5 6 7 8 9 10 11
| <?php abstract class User { protected$sal = 0; abstract function getSal(); abstract function setSal($sal); } abstract class VipUser extends User { } ?>
|
抽象类在被继承后,其中的抽象方法不能被重写。
如果发生重写,系统会报错。
1 2 3 4 5 6 7 8 9 10 11 12
| <?php abstract class User { protected$sal = 0; abstract function getSal(); abstract function setSal($sal); } abstract class VipUser extends User { abstract function setSal(); } ?>
|
抽象类继承抽象类,目的对抽象类的扩展。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <?php abstract class User { protected$sal = 0; abstract function getSal(); abstract function setSal($sal); } abstract class VipUser extends User { protected$commision = 0; abstract function getCommision(); abstract function setCommision(); } ?>
|
静态抽象方法
在PHP5.1中,抽象类中支持静态抽象方法。下面这个例子,看到静态抽象方法可以声明。实现这个方法时,必须是静态的方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <?php abstract class User { protectedstatic$sal = 0; static abstract function getSal(); static abstract function setSal($sal); } class VipUser extends User { static function getSal() { return self::$sal; } static function setSal($sal) { self::$sal = $sal; } } VipUser::setSal(100); echo"you sal is " . VipUser::getSal(); ?>
|
本文早期发布于个人 CSDN 博客:查看原文