PHP中traits的特性及用法

2023-12-06 00:16:06

浏览:81

评论:0

自5.4.0版本开始,PHP 实现了一种代码复用的方法,称为 traits

traits由来

php是一种单继承语言,单继承语言存在着多种缺陷,例如:

  • 单继承限制:在单继承语言中,一个类只能继承自一个父类。这意味着,如果需要复用多个类的功能,就需要创建一个新的父类来包含这些功能,然后让需要复用这些功能的类继承自这个新的父类。这种方式可能会导致代码的复杂度增加,并且不利于代码的维护和扩展。
  • 代码重复:在单继承语言中,如果需要复用多个类的功能,可能需要在不同的子类中重复实现这些功能。这可能会导致代码的重复,增加了代码的维护成本。
  • 灵活性不足:在单继承语言中,子类只能继承父类的公有成员,而不能继承父类的私有成员。这意味着,如果需要复用父类的私有成员,就需要将这些私有成员公开,这可能会破坏类的封装性,降低代码的可维护性。
  • 难以扩展:在单继承语言中,如果需要在子类中添加新的功能,可能需要修改父类的代码。这可能会导致代码的不稳定性,并且不利于代码的扩展。

为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method,于是就有了Trait特性。 Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。

Trait的使用

<?php
trait Hello {
    public function sayHello() {
        echo 'Hello ';
    }
}

trait World {
    public function sayWorld() {
        echo 'World';
    }
}

class MyHelloWorld {
    use Hello, World;
    public function sayExclamationMark() {
        echo '!';
    }
}

$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
$o->sayExclamationMark();
// 输出“Hello World!”
?>

php8.3以下版本Trait的使用问题 https://github.com/php/php-src/issues/10935

Trait的优劣

  1. trait无法通过自身来实例化。
  2. trait它为传统继承增加了水平特性的组合,使用它的类,不需要继承。只需要 use 引入。
  3. Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能。