设为首页 收藏本站
查看: 513|回复: 0

[经验分享] PHP类实例教程(十七):abstract类和abstract方法

[复制链接]

尚未签到

发表于 2017-4-8 10:17:39 | 显示全部楼层 |阅读模式
  可以使用abstract来修饰一个类或者方法。
  用abstract修饰的类表示这个类是一个抽象类,用abstract修饰的方法表示这个方法是一个抽象方法。
  抽象类不能被实例化。
  抽象方法是只有方法声明,而没有方法的实现内容。
abstract 抽象类
  可以使用abstract来修饰一个类。
  用abstract修饰的类表示这个类是一个抽象类。
  抽象类不能被实例化。
  这是一个简单抽象的方法,如果它被直接实例化,系统会报错。<?php//定义一个抽象类abstract class User{public function __toString() {return get_class($this);} }//实例化这个类会出现错误echo new User();?>
  下面例子的 NormalUser 继承自 User类,就可以被实例化了。
  <?php//定义一个抽象类abstract class User{public function __toString() {return get_class($this);} }//实例化这个类会出现错误echo new User();class NormalUser extends User{}$a = new NormalUser();echo "这个类" . $a . "的实例";?>
  单独设置一个抽象类是没有意义的,只有有了抽象方法,抽象类才有了血肉。下面介绍抽象方法。
abstract 抽象方法
  用abstract修饰的类表示这个方法是一个抽象方法。
  抽象方法,只有方法的声明部分,没有方法体。
  抽象方法没有 {} ,而采用 ; 结束。
  一个类中,只要有一个抽象方法,这个类必须被声明为抽象类。
  抽象方法在子类中必须被重写。
  下面是一个抽象类,其中有两个抽象方法,分别是 setSal() 和 getSal()。用来取回 $sal 员工的工资。
  <?phpabstract class User{protected $sal = 0;//这里定义的抽象方法。//注意抽象方法没有方法体,而且方法结束使用 ; 号。abstract function getSal();abstract function setSal();//定义它的__tostring方法public function __toString() {return get_class($this);} } ?>
  既然User类不能被直接继承,我们写一个NormalUser类继承自User类。当我们写成如下代码时,系统会报错。 这个错误告诉我们,在 User类中有两个抽象方法,我们必须在子类中重写这两个方法。
  <?phpabstract class User{protected $sal = 0;//这里定义的抽象方法。//注意抽象方法没有方法体,而且方法结束使用 ; 号。abstract function getSal();abstract function setSal();//定义它的__tostring方法public function __toString() {return get_class($this);} }class NormalUser extends User{}?>
  下面例子,重写了这两个方法,虽然方法体里面 {} 的内容是空的,也算重写了这个方法。注意看重写方法的参数名称,这里只要参数数量一致就可以,不要求参数的名称必须一致。
  <?phpabstract class User{protected $sal = 0;//这里定义的抽象方法。//注意抽象方法没有方法体,而且方法结束使用;号。abstract function getSal();abstract function setSal();//定义它的__tostring方法public function __toString() {return get_class($this);} }class NormalUser extends User{function getSal() {}function setSal($sal) { }}//这样就不会出错了。?>
  下面19-21行,三种写重写的方式都会报错。
  19行,缺少参数。
  20行,参数又多了。
  21行,参数类型不对。(这种写法在以后章节介绍)
  一个类中,如果有一个抽象方法,这个类必须被声明为抽象类。
  下面这个类不是抽象类,其中定义了一个抽象方法,会报错。
  <?phpclass User{protected $sal = 0;//这里定义的抽象方法。//注意抽象方法没有方法体,而且方法结束使用;号。abstract function getSal();abstract function setSal();//定义它的__tostring方法public function __toString() {return get_class($this);} }//这个类中有两个抽象方法,如果这个类不是抽象的。会报错?>
  抽象类继承抽象类
  抽象类继承另外一个抽象类时,不用重写其中的抽象方法。
  抽象类中,不能重写抽象父类的抽象方法。
  这样的用法,可以理解为对抽象类的扩展
  下面的例子,演示了一个抽象类继承自另外一个抽象类时,不需要重写其中的抽象方法。
  <?phpabstract class User{protected $sal = 0;abstract function getSal();abstract function setSal($sal); }abstract class VipUser extends User{}?>
  抽象类在被继承后,其中的抽象方法不能被重写。
  如果发生重写,系统会报错。
  <?phpabstract class User{protected $sal = 0;abstract function getSal();abstract function setSal($sal); }abstract class VipUser extends User{abstract function setSal(); }?>
  抽象类继承抽象类,目的对抽象类的扩展。
  <?phpabstract 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中,抽象类中支持静态抽象方法。下面这个例子,看到静态抽象方法可以声明。实现这个方法时,必须是静态的方法。
静态抽象方法
  在PHP5.1中,抽象类中支持静态抽象方法。下面这个例子,看到静态抽象方法可以声明。实现这个方法时,必须是静态的方法。
  <?phpabstract class User{protected static  $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();?>//这里的抽象方法好像没有问题

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-361838-1-1.html 上篇帖子: PHP类实例教程:abstract类和abstract方法 下篇帖子: PHP类实例教程(十三):Static的用法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表