被继承的类叫父类。子类继承父类的属性和方法。通过子类扩展了父类的功能,是之前所学的扩展性。
<?php class Dad { public function Kungfu() { echo "降龙十八掌"; } } class Boy extends Dad //使用 extends 关键字使子类继承父类 { } $boy = new Boy(); $boy->Kungfu(); //结果为:降龙十八掌 (子类继承父类的属性和方法)
当父类的方法是私有的(private),子类不能调用,只有父类本身类的内部能用。
当父类的方法是受保护的(protected),只能被父类自己和继承的子类调用,其他类和外部不能调用。
方法名相同时,子类的方法覆盖父类的方法:
<?php class Dad { public function Kungfu() { echo "降龙十八掌"; } } class Boy extends Dad { public function Kungfu() //方法名相同时,子类的方法覆盖父类的方法: { echo "凌波微步无影掌"; } } $boy = new Boy(); $boy->Kungfu(); //结果为:凌波微步无影掌
当子类没有构造方法时,会自动调用父类的构造方法。
当子类有自己的构造方法时,就调用自己的构造方法,而不会调用父类的构造方法。若既想调用父类的构造方法也有子类的,用 parent 关键字。如:
<?php class Dad { public function __construct() { echo "dad dad..."; } public function Kungfu() { echo "降龙十八掌"; } } class Boy extends Dad { public function __construct() { parent::__construct(); //若既想调用父类的构造方法也有子类的,用 parent 关键字。 echo "boy boy.."; } } $boy = new Boy(); $boy->Kungfu(); //结果为:dad dad...boy boy...降龙十八掌
父类不想被子类继承,用 final 关键字,如:
final class Dad
父类的某个方法不想被子类继承,用 final 关键字,如:
final public function Kongfu()
子类继承父类,如果子类没有构造方法,实例化子类的时候会调用父类的构造方法。如果子类中有构造方法,会调用自身子类的构造方法。如果子类中也想调用父类的构造方法,可以用parent调用
组合和继承?
final class Dad{}前加关键字不会被子类继承
final protected function Kungfu前加final方法不会被重写
子类有和父类相同方法的时候显示自己的方法。
子类没有构造方法的时候会自动继承父类的构造方法,都有的时候就调用自己的构造方法。
当子类方法与父类同名,子类是会覆盖父类的方法。
当子类没有构造方法时,会去调用父类的构造方法,当子类有自己的构造方法,就会调用自己的构造方法。
组合和继承
继承:class A extends B { }--------A继承B
Boy 就是派生类,Dad就是父类即基类
子类继承父类
*类的继承
父类有构造方法 子类没有构造方法 那么当实例化子类时会自动调用父类的构造方法
如果子类自己有构造方法 子类就会调用自己的构造方法 而不会去调用父类的构造方法 若还想调用父类的构造方法 应使用 parent::__construct();
如果在类前面加final关键字 final class Dad{ } 则该类不能被继承
如果在方法前面加 final关键字 则 此方法 在子类中 不能被重写
子类可以覆盖继承的父类的同方法名的方法
private 只有自己本身 类的内部能够访问 除此之外的一切地方是无法访问的 子类继承不能使用
protected 只有自己和继承自己的子类可以进行调用
子类继承基类,如果子类新建方法和基类一样的时候,子类的方法会覆盖基类的方法。
子类继承基类,如果基类有构造方法,子类实例化的时候会调用基类的构造方法
this:类的实例
selft:类自己
parent:分类
当父类中的方法和子类中的方法一致时,子类中的方法会覆盖父类中的方法,
以下程序最终会输出:“降龙十八掌 + 凌波微步”
当子类的方法名与父类的方法名重名子类中的方法会覆盖父类中的方法