PHP
继承
- 继承使用关键字
extends - 子类继承父类时, 将会覆盖掉父类的同名属性或方法, 包括魔术方法(
__construct ) - 子类继承父类时, 同名的属性或方法的修饰符只能向宽松的方法延伸(父类为
protected , 子类可以为 protected 或 public , 不能为 private ) - 子类可以使用
parent 访问被覆盖的父类方法
parent::__construct();
static 关键字修饰的静态成员没有覆盖的动作, 通过 类名 或 self 进行访问, 父类可以使用 static 访问最终实例化对象所属类的成员
static::$nickname
抽象
- 抽象使用关键字
abstract - PHP 5 支持抽象类和抽象方法。定义为抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。
- 继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)
接口
- 接口使用关键字
interface 和 implements - 使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。 由于接口(interface)和类(class)、trait 共享了命名空间,所以它们不能重名
- 接口中定义的所有方法都必须是公有,这是接口的特性。
- 接口可以定义魔术方法,以便要求类(class)实现这些方法, 虽然没有禁止,但是强烈建议不要在接口中使用构造器
- 接口中也可以定义常量。接口常量和类常量的使用完全相同,但是不能被子类或子接口所覆盖。
- 接口支持多继承
interface INT3 extends INT1, INT2{}
class Child extends Base implements INT1, INT2
trait
- trait 使用关键字
trait - Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。
- Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能。 无法通过 trait 自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用的几个 Class 之间不需要继承。
- 从基类继承的成员会被 trait 插入的成员所覆盖。优先顺序是来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法。
- 使用
insteadof 解决重名的冲突, 使用 as 修改名称也可以解决冲突, as 还可以修改访问控制级别(不受宽松的限制, 任意修改)
trait Trait1
{
public function print()
{
echo 'trait1';
}
}
trait Trait2
{
public function print()
{
echo 'trait2';
}
}
class Child
{
public function __construct() {
$this->print();
$this->print2();
}
use Trait1, Trait2 {
Trait1::print insteadof Trait2;
Trait1::print as protected;
Trait2::print as protected print2;
}
}
$instant = new Child();
|