博客列表 >PHP 类相关基础知识

PHP 类相关基础知识

Yang_Sir
Yang_Sir原创
2020年04月29日 17:02:54593浏览

php中的类和方法、以及抽象类抽象方法、接口

通过类实现面向对象编程,将通用功能分类,重复使用。
使用抽象类,指定要实现的功能,使功能设计和具体实现部分分离,
接口设计统一规范的功能模块要求

1.类和类的继承

  • 通过关键字extends继承父类的属性和方法
  1. //基类:商户信息维护
  2. class Merchant
  3. {
  4. protected $number = '';//商户编号
  5. public $name = '';//商户名称
  6. protected function setNumber(string $number){
  7. $this->number = $number;
  8. }
  9. /**
  10. * 设置名称
  11. */
  12. public function setName($name)
  13. {
  14. $this->name = $name;
  15. }
  16. /**
  17. * 修正名称
  18. * 返回修正后名称
  19. */
  20. public function editName()
  21. {
  22. //去掉两端空白字符
  23. $this->name = trim($this->name);
  24. //计算长度
  25. $str_len = mb_strlen($this->name,'utf8');
  26. //如果名称超过20个字,就删除多余字
  27. //如果名称少于9个字,就填充到9个字
  28. if($str_len>20){
  29. $this->name = mb_substr($this->name,0,20,'utf8');
  30. }elseif($str_len<3){
  31. return '无效名称';
  32. }elseif($str_len<6){
  33. $this->name = str_pad($this->name,27,'略',STR_PAD_RIGHT);
  34. }
  35. return $this->name;
  36. }
  37. /**
  38. * 最终方法,不能在子类中重写
  39. */
  40. final public function getName(){
  41. return $this->name;
  42. }
  43. }
  44. // $merchant = new Merchant;
  45. // $merchant->setName('龙门客栈');
  46. // echo $merchant->getName();
  47. class EditMerchant extends Merchant
  48. {
  49. public static $status = 0;//静态属性,状态
  50. public function setNumber(string $number){
  51. parent::setNumber($number);
  52. }
  53. public function getNumber()
  54. {
  55. return $this->number;
  56. }
  57. /**
  58. * 修正商户编号
  59. */
  60. public function editNumber()
  61. {
  62. //只允许由数字和字母组成的编号
  63. if(!ctype_alnum($this->number)){
  64. return '非法编号';
  65. $this->number = '';
  66. }
  67. if(strlen($this->number)<12){
  68. $this->number = str_pad($this->number,12,0,STR_PAD_RIGHT);
  69. }
  70. return $this->number = substr($this->number,0,12);
  71. }
  72. }
  73. //直接访问静态属性
  74. echo '商户状态:',EditMerchant::$status?'正常':'停用';//输出:商户状态:停用
  75. //实例化
  76. $editMerchant = new EditMerchant;
  77. $editMerchant->setName('龙门客栈');
  78. //直接调用父类中的方法
  79. echo '<br>', $editMerchant->editName();//输出:龙门客栈略略略略略
  80. //将setNumber重写为公开方法后设置商户编号
  81. $editMerchant->setNumber('88048874HGJK001');
  82. //通过getNumber方法获取受保护的变量
  83. echo '<br>',$editMerchant->getNumber();//输出:88048874HGJK001
  84. //子类中扩展的方法editNumber()
  85. echo '<br>',$editMerchant->editNumber();//输出:88048874HGJK

2.抽象类和抽象方法

  • 使用abstract定义抽象类和抽象方式
  • 抽象类不能被实例化,只能继承后使用
  • 抽象类中可以定义常规方法
  • 抽象方法在子类中必须实现
  1. /抽象类和抽象方法
  2. abstract class Card
  3. {
  4. public $cardno = '';
  5. //普通方法
  6. public function setCardno(int $cardno){
  7. $this->cardno = $cardno;
  8. }
  9. //抽象方法,没有方法体,指定子类必须要实现的功能
  10. abstract function editCardno();
  11. }
  12. //抽象类不能实例化
  13. //new Card;//atal error: Uncaught Error: Cannot instantiate abstract class Card
  14. //用常规类来继承抽象类
  15. class EditCard extends Card
  16. {
  17. //父类中的抽象方法必须实现
  18. public function editCardno(){
  19. if(strlen($this->cardno)!==16||strlen($this->cardno)!==19){
  20. return '请使用正确的卡号';
  21. }
  22. return $this->cardno;
  23. }
  24. }
  25. $editCard = new EditCard;
  26. //使用抽象父类中的常规方法
  27. $editCard->setCardno(62284854654642);
  28. echo '<br>','输入的卡号为:',$editCard->cardno;//输出:输入的卡号为:62284854654642
  29. //子类实现了父类中的抽象方法
  30. echo '<br>','判断结果为:',$editCard->editCardno();//输出:请使用正确的卡号

3.接口语法

  • interface关键字定义接口
  • 接口中设置抽象方法,定义必须要实现的方法。只能是公用方法
  1. //接口定义常量和方法,不具体实现
  2. interface iMessage
  3. {
  4. //接口常量
  5. const MSG_ID = '"code"';
  6. const MSG_CONTENT = '"msg"';
  7. //接口方法
  8. public function getMsg();
  9. }
  10. //类中实现接口中的方法
  11. class Message implements iMessage{
  12. public function getMsg(){
  13. return self::MSG_ID.':'.self::MSG_CONTENT;
  14. }
  15. }
  16. $msg = new Message;
  17. echo '<br>', $msg->getMsg();//输出:"code":"msg"
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议