继承
概念:
- 继承:一个类从另一个已有的类获得其特性,称为继承;
- 派生:从一个已有的类产生一个新的类,称为派生;
- 父类/子类:已有类为父类,新建类为子类,父类又可以称为“基类”,上级类,子类又称为派生类,下级类;
- 单继承:一个类只能从一个上级类继承其特性信息,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 |
总结说明:
- public修饰的成员,哪里都能访问;
- 类的内部,可以访问任何级别的成员;
- public具有最宽泛的可访问性,private具有最狭小的可访问性,protected则居中。
parent关键字
含义:parent表示“父母”的意思,在面向对象语法中,代表“父类”–本质上就是代表父类这个“类”,而不是父类的“对象”;
使用方式:
parent::属性或方法: // 通常是静态属性或静态方法,但有时候可能是实例属性或实例方法;
对比前面两个词:
关键字 | 含义 | 使用位置 | 使用示例 |
---|---|---|---|
parent | 代表父类(不是实例) | 肯定在一个方法中 | parent::属性或方法 |
self | 代表当前这个类(也是类) | 肯定在一个方法中 | self::静态属性或方法 |
$this | 代表调用当前这个方法的实例 | 肯定在一个方法中 | $this->实例属性或方法 |
构造方法和析构方法调用上级同类方法的问题
- 如果一个类有构造方法,则实例化这个类的时候,就不会调用父类的构造方法(如果有)
- 如果一个类没有构造方法,则实例化这个类的时候,就会调用父类的构造方法(如果有)
- 如果一个类有析构方法,则销毁这个类的时候,就不会调用父类的析构方法(如果有)
- 如果一个类没有析构方法,则销毁这个类的时候,就会调用父类的析构方法(如果有)
手动调用的语法形式总是这样:
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可以用访问控制符修饰类。