php面向对象(三),抽象类,抽象方法,接口及php的”重载“

抽象类

  • 定义:一个抽象的不能被实例化的类。
  • 定义形式(abstract关键字):

    abstract class 类名{
        // ...
    }

抽象方法

  • 定义:一个只有方法头,没有方法体的方法

  • 定义形式(用abstract修饰方法)

    abstract class 类名{
        abstract function 方法名(形参列表); // 没有方法体,结尾分号不能省略
    }

抽象类和抽象方法的细节:

  • 一个抽象方法必须在抽象类中,即方法为抽象的,那么其所在的类也不是是抽象的;
  • 抽象类中可以没有抽象方法;
  • 子类继承了父类,那么要么实现(“重写”)父类的抽象方法,要么在次定义为抽象的。

重载

  • 含义:在“通常面向对象语言”中是指一个类可以名字相同但形参不同的方法的现象(如java)。

    如:

    class A{
        function f(){
    
        }
        function f($a){
    
        }
        function f($a,$b){
    
        }
    }

php中的重载

  • 含义:是指当对一个对象或类使用其未定义的属性或方法的时候,其中的一些“处理机制”。

  • 属性重载:

    • 含义:对一个对象的不存在的属性进行使用的时候,这个类种预先设定好的应对方法(处理机制)
  • 属性,本质就是一个变量,其有4个操作:

    • 取值:当对一个对象的不存在的属性进行“取值”的时候,就会自动调用方法:__get()
    • 赋值:当对一个对象的不存在的属性进行“取值”的时候,就会自动调用方法:__set()
    • 判断(isset):当对一个对象的不存在的属性进行“判断”的时候,就会自动调用方法:__isset()
    • 判断(isset):当对一个对象的不存在的属性进行“判断”的时候,就会自动调用方法:__unset()
  • __set($属性名,值):

    • 含义:当对一个对象的不存在属性进行“赋值”的时候就会自动调用这个内部的魔术方法,它有两个形参,分别代表对不存在的属性进行赋值的时候的“属性名”和“属性值”。

       这个方法结合__get()方法,往往可以使我们定义的类,就有一种“可简便扩展属性”的特性,即类(或对象)的属性,可以更为方便自由,如下所示:

      class A{
          protected $prop_list = array();
          function __set($p,$v){
              $this->prop_list[$p] = $v;
          }
          function __get($p){
              return $this->prop_list[$p];
          }
      }
  • __isset()

    • 含义:当对一个对象的不存在属性进行“判断”的时候就会自动调用这个内部的魔术方法。
  • __unset()

    • 含义:当对一个对象的不存在属性进行“销毁”的时候就会自动调用这个内部的魔术方法。
  • 方法重载

    • 当对一个对象的不存在的实例方法进行“调用”的时候会自动调用类中的__call()这个魔术方法;

    • 当对一个对象的不存在的静态方法进行“调用”的时候会自动调用类中的__callstatic()这个魔术方法。

    • php中实现通常的面向对象语言的“方法重载”(利用__call()__callstatic()方法),如:

      <?php
      class A{
      
          function __call($methodName,$arguments){
              switch ($methodName) {
                  case 'f1': // 调用了f1这个不存在的方法
                      # 调用了方法名为f1的这一系列重载方法
                      if(count($arguments) == 0){
                          // 这里拿这些参数做这个方法的事情...
                      }else if(count($arguments) == 1){
                          // 这里拿这些参数做这个方法的事情...
                      }else if(count($arguments) == 2){
                          // 这里拿这些参数做这个方法的事情...
                      }else if(count($arguments) == 3){
                          // 这里拿这些参数做这个方法的事情...
                      }
                      // ...
                      break;
                  case 'f2': // 调用了f2这个不存在的方法
                      # 调用了方法名为f2的这一系列重载方法
                      if(count($arguments) == 0){
                          // 这里拿这些参数做这个方法的事情...
                      }else if(count($arguments) == 1){
                          // 这里拿这些参数做这个方法的事情...
                      }else if(count($arguments) == 2){
                          // 这里拿这些参数做这个方法的事情...
                      }else if(count($arguments) == 3){
                          // 这里拿这些参数做这个方法的事情...
                      }
                      // ...
                      break;
                  default:
                      break;
              }
          }
      }
      ?>

接口

  • 定义形式

    interface 接口名{
        常量1;
        常量2;
        ...
        抽象方法1;
        抽象方法2;
        ...
    }
  • 说明:

    1. 接口中只有常量(接口常量)和抽象方法两种成员;
    2. 接口常量的使用形式为:接口名称::常量名称
    3. 接口中的抽象方法,不要使用abstract修饰,也需要使用访问控制修饰符,因为其天然就是Public
    4. php中接口和类一样也可以继承(接口继承接口)。

还谈php和java面向对象

  • 相同点:

    • 抽象类和抽象方法,及它们之间的细节都一样;
    • php的接口和java的接口都一样。
  • 不同点:

    • 重载不一样,php重载和其他面向对象语言的重载不同,而java和其他面向对对象语言的重载一样。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值