继承
基本概念
- 继承,一个类从另一个已有的类获得其特性,成为继承;
- 派生,从一个已有的类产生一个新的类,成为派生
- 继承和派生,其实只是从不同角度表述,本质是一个事情
- 父类/子类,已有类为父类,新建类为子类
- 单继承,一个类只能从一个上级类继承其特性信息。php和大多数面向对象的语言都是单继承,c++是多继承
- 扩展:在子类中再定义自己的一些新的特有的特性信息(属性,方法,常量)。没有扩展,继承也就没有意义
class Person {
public $head = '我有大脑' ;
}
class Teacher extends Person {
public $skill = '我会教书' ;
function say (){
echo $this->head ;
echo $this->skill ;
}
}
$t1 = new Teacher() ;
$t1->say() ; //我有大脑我会教书
访问(权限)修饰符
- 在类中的成员,通常都可以在前面加上以下3个修饰符:
- public
- protected
- private
public
用该修饰符修饰的成员,可以在任何位置使用和访问
对象->成员 ;
类名::成员;访问位置分为3个
- 某个类内部
- 某个类的具有继承关系的子(父)类的内部,只是其他类在某个方法中
- 某个类的外部:一般就是独立的代码区(不在类中)
protected 受保护的
protected修饰的成员,可以在当前类或当前类的上下级具有继承关系的类中访问
private 私有的
private修饰的成员,只能在其所在的类中访问;
总结
parent 代表父类
对比:self代表本类(自己当前类)
parent通常用于在子类中调用父类的成员的时候使用,多数就是使用父类的静态成员。parent代表类,而非对象
构造和析构方法在继承中的表现
- 子类中没有定义构造方法时,会自动调用父类的构造方法,因此实例化子类时,需按照父类的构造方法的形式进行
- 子类定义了自己的构造方法,则不会自动调用父类的构造方法,但可以手动调用parent::__construct() ;
- 子类中没有定义析构方法时,会自动调用父类的析构方法;
- 子类定义了自己的析构方法,则不会自动调用父类的析构方法,但可以手动调用parent::__destruct()
重写
- 重写又叫覆盖,就是将父类继承下来的属性或方法重新定义,只有保护的或公有的属性或方法能够被覆盖。
- 重写的原因是父类的某个属性可能对于子类来说不够具体或详细,子类想要同样特性或功能
- 重写的基本要求:访问控制权限,方法的参数形式。
- 私有属性和私有方法的重写问题,私有属性和方法不能覆盖,但其实子类可以定义跟父类私有的同名属性或方法,只是当做一个自身的新属性或方法来看待而已,不过方法的参数必须一致
- 构造方法的重写问题,构造方法不但可以像其他普通方法一样重写,而且,比普通方法更宽松,重写的时候参数可以不一致。
子类覆盖父类的方法,虽然可以去调用父类的同名方法去完成一定的工作,但不是必须的,也有可能父类的该方法所执行的结果并不适合子类,此时子类就去完全自己写了
最终类 final class
通常一个类,没有特别声明的话,则‘别人’就可以随意拿过来使用并对之进行‘扩展’–继承。
但是,如果某个类不希望对其进行扩展,则可以将其声明为‘最终类’
形式:
fina class 类名{ … }
最终方法 final method
通常一个方法,如果没有特别声明,则下级类就可以对其进行重写。
但是,如果某个方法不希望被下级类重写,就可以对其声明为‘最终方法’;
形式:
final function 方法名(){ … }