PHP中traits的特性及用法
2023-12-06 00:16:06
浏览:82
评论: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的优劣
- trait无法通过自身来实例化。
- trait它为传统继承增加了水平特性的组合,使用它的类,不需要继承。只需要 use 引入。
- Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能。