php面向对象(二),继承,重写,parent,final关键字及访问控制

来源:互联网 发布:网络运营岗位的测试题 编辑:程序博客网 时间:2024/05/21 10:49

继承

  • 概念:

    • 继承:一个类从另一个已有的类获得其特性,称为继承;
    • 派生:从一个已有的类产生一个新的类,称为派生;
    • 父类/子类:已有类为父类,新建类为子类,父类又可以称为“基类”,上级类,子类又称为派生类,下级类;
    • 单继承:一个类只能从一个上级类继承其特性信息,php和大多数面向对象语言(如java)都是单继承模式,c++是多继承;
    • 扩展:在子类再来定义自己的一些新的特有的特性信息(属性,方法和常量)。没有扩展,继承也就没有意义了。
  • php中的继承(extends关键字)

    • 形式:

      class A{    // 类成员...}class B extends A{    // 类成员...}
    • 说明:

      • php和大多数面向对象(如java)一样是单继承,c++是多继承,但php和java一样单继承但可以多重继承。

访问控制修饰符

  • 形式:

    class 类名{    访问控制修饰符 【static】 属性或方法; }
  • 3个修饰符:

    • public 公共的:在所有位置都可以访问(使用);
    • protected 受保护的:只能在该类内部和该类的子类或父类中访问(使用);
    • private 私有的:只能在该类的内部访问(使用)。

    说明:他们的作用是:用来“限制”其所修饰的成员的“可访问性”。

  • 3个访问位置:

    • 类的内部
    • 类的继承类的内部
    • 某个类的外部

 访问控制修饰符,需要结合该语法形式所在位置,才能确定是否可访问,则它们的结合可访问性如下:

修饰符 类内部 子类内部 类外部 public Yes Yes Yes protected Yes Yes No private Yes No No


总结说明:

  1. public修饰的成员,哪里都能访问;
  2. 类的内部,可以访问任何级别的成员;
  3. public具有最宽泛的可访问性,private具有最狭小的可访问性,protected则居中。

parent关键字

  • 含义:parent表示“父母”的意思,在面向对象语法中,代表“父类”–本质上就是代表父类这个“类”,而不是父类的“对象”;

  • 使用方式:

    parent::属性或方法: // 通常是静态属性或静态方法,但有时候可能是实例属性或实例方法;

对比前面两个词:

关键字 含义 使用位置 使用示例 parent 代表父类(不是实例) 肯定在一个方法中 parent::属性或方法 self 代表当前这个类(也是类) 肯定在一个方法中 self::静态属性或方法 $this 代表调用当前这个方法的实例 肯定在一个方法中 $this->实例属性或方法

 

构造方法和析构方法调用上级同类方法的问题

  1. 如果一个类有构造方法,则实例化这个类的时候,就不会调用父类的构造方法(如果有)
  2. 如果一个类没有构造方法,则实例化这个类的时候,就会调用父类的构造方法(如果有)
  3. 如果一个类有析构方法,则销毁这个类的时候,就不会调用父类的析构方法(如果有)
  4. 如果一个类没有析构方法,则销毁这个类的时候,就会调用父类的析构方法(如果有)

手动调用的语法形式总是这样:

parent::构造方法或析构方法();

覆盖(重写)

  • 含义:将一个类从父类中继承过来的属性和方法“重新定义”–此时相当于子类不想用父类的该属性或方法,,而是重新定义

  • 基本要求:

    • 访问控制权限:

       子类覆盖的属性或方法的访问控制权限,不能“低于“父类的被覆盖的属性或方法的访问控制权限

    • 方法的参数形式:

       子类覆盖父类的同名方法的时候参数要求和父类一致

ps:虽然父类的私有属性(或私有方法)不能被覆盖,但子类却可以定义和父类名字相同的属性(或方法)

最终类:(和java一样,用final关键字修饰类)

  • 最终类,其实就是一种特殊要求的类,要求该类不允许往下继承下去

  • 形式:

    final class 类名{    // 类的成员定义。。。}

最终方法:(和java一样,用final修饰方法)

  • 定义:一个不允许下级类去覆盖(重写)的方法。

  • 形式:

    class 类名{    final function 方法名(形参列表...){        // ...    }}

再比php和java面向对象

  • 相同点:

    • 继承形式同样是通过extends关键字;
    • 3个访问控制修饰符和java中同名的3个访问控制符基本一样;
    • final关键字含义和使用基本相同;
    • php的parent关键字有点类似java的super关键字;
    • 诸多修饰符如public,static,final可以同时修改方法,且无顺序区别(通常是public static fianl 方法名)。
  • 不同点:

    • java中除了php有的3个访问控制符外还多了一个访问控制符 叫default(因为java中有包的概念);
    • php和java的访问修饰符都可以省略,但php省略时默认是public,而java是default(省略);
    • php中final不能修饰属性,而java用fianl修饰属性时,表示这是一个常量(php常量用const修饰);
    • php中访问控制符不能修饰类,而java可以用访问控制符修饰类。
0 0