博主信息
超超多喝水
博文
38
粉丝
0
评论
0
访问量
2633
积分:0
P豆:76

抽象类与接口、后期静态绑定与魔术方法简单总结

2021年10月24日 20:31:45阅读数:21博客 / 超超多喝水/ PHP学习

抽象类与接口、后期静态绑定与魔术方法简单总结

抽象类

抽象类:设计类与实现类是分离的,抽象类可以给子类提供一些公用的方法,作为子类的重写模板来使用

  • 抽象类也是多态的一种,抽象类只对方法跟类做一个大概的描述,但是没有具体的实现
  • 抽象类跟方法使用 abstract 关键字声明,抽象方法可以是静态方法
  • 抽象类不可被实例化,无法生成对象
  • 使用抽象类,需要继承抽象类后把里面的抽象方法全部重写,如果没有全部重写,那么该继承的子类也还是抽象类
  • 抽象类中可以存在普通属性跟普通方法
  • 抽象类中可以使用构造函数
  1. abstract class Father{
  2. public $name;
  3. abstract public function eat();
  4. public function say(){
  5. return "my name is {$this->name}";
  6. }
  7. public function __construct($n)
  8. {
  9. $this->name=$n;
  10. }
  11. }
  12. class Son extends Father{
  13. //重写eat方法
  14. public function eat(){
  15. return "I'm eating";
  16. }
  17. }
  18. $obj = new Son("admin");
  19. echo $obj->say();
  20. echo '<hr>';
  21. echo $obj->eat();
  22. echo '<hr>';
  23. echo $obj->name;

接口

在类里面,不管是普通类还是抽象类都是单继承,即一个子类只能继承一个父类,但是实际开发中,我们会需要一个子类继承多个父类,这种情况下就可以使用接口来实现,接口也是多态的一种。

  • 接口使用 interface 关键字替换掉 class 关键字来创建
  • 接口中,只允许声明两个成员:1.类常量,2 抽象方法

    类常量

    • 类常量使用 const 关键字声明
    • 关键字后面直接跟常量名称不需要加$符
    • 一般默认所有字母大写
    • 类常量的值不允许更改
    • 类常量会默认为静态成员
      >
  • 接口中的抽象方法也可以是静态方法
  • 重写接口中的静态方法时,也必须按照静态重写
  • 接口中的抽象方法不带 abstract 关键字
  • 子类使用接口使用 implements 关键字
  • 一个子类同时使用多个接口,多个接口之间用英文逗号,隔开
  1. interface Father{
  2. const NAME = 'admin';
  3. public static function eat($name);
  4. }
  5. class Son implements Father{
  6. public static function eat($name){
  7. return "I'm eating".$name.self::NAME;
  8. }
  9. }
  10. // $obj = new Son();
  11. echo Son::eat('php&');
  12. echo '<hr>';

后期静态绑定

在普通类与普通方法中,可以使用$this将属性或方法与当前实例化的类绑定,但是静态方法的self只能与当前所在的类绑定,如果想要实现与普通方法中$this 相同的效果,就需要用到后期静态绑定也叫延迟静态绑定,使用 static 关键字调用

  1. class Father{
  2. public function demo(){
  3. return "Father 下的demo方法";
  4. }
  5. public function test(){
  6. return $this->demo();
  7. }
  8. }
  9. class Child extends Father{
  10. public function demo(){
  11. return "Child 下的demo方法";
  12. }
  13. }
  14. $father = new Father();
  15. $child = new Child();
  16. echo $father->test();
  17. echo '<hr>';
  18. echo $child->test();
  19. echo '<hr>';
  20. echo '后期静态绑定';
  21. echo '<hr>';
  22. class Father1{
  23. public static function demo(){
  24. return "Father 下的demo方法";
  25. }
  26. public function test(){
  27. return static::demo();
  28. }
  29. }
  30. class Child1 extends Father1{
  31. public static function demo(){
  32. return "Child 下的demo方法";
  33. }
  34. }
  35. $father1 = new Father1();
  36. $child1 = new Child1();
  37. echo $father1->test();
  38. echo '<hr>';
  39. echo $child1->test();

常用魔术方法

  • __construct()构造方法:在实例化一个类的时候自动调用
  • __destruct()析构方法:在类执行完或者销毁时自动调用
  • __call(函数名,函数参数):在对象中调用一个不可访问的方法时自动调用
  • __callStatic(函数名,函数参数):调用一个类里面不可访问的静态方法时自动调用
  • __get():在调用一个类里面不可访问的属性时自动调用
  1. class Father{
  2. public $name = 'admin';
  3. protected $age = 18;
  4. public function __get($param){
  5. if(!empty($this->$param)){
  6. return '您访问的属性是:'.$param.'值是:'.$this->$param;
  7. }else{
  8. return "参数不存在";
  9. }
  10. }
  11. public function __set($param,$values){
  12. if(!empty($this->$param)){
  13. echo '您要修改的属性是:'.$param.'值改为了:'.$values;
  14. return $this->$param = $values;
  15. }else{
  16. echo "参数不存在";
  17. }
  18. }
  19. }
  20. $obj = new Father();
  21. echo $obj->age;
  22. echo '<hr>';
  23. $obj->age = 28;
批改状态:未批改

老师批语:

版权申明:本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!

全部评论

文明上网理性发言,请遵守新闻评论服务协议

条评论