💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] PHP 实现了一种代码复用的方法,称为 trait https://www.php.net/trait ### 优先级: 当前类 会覆盖 trait ,trait会覆盖base类; 1、覆盖base ![](https://img.kancloud.cn/db/5b/db5bafeff9cb4b499d0987b725896a46_454x803.png) 2、当前覆盖trait ![](https://img.kancloud.cn/ad/da/adda6ca5c8883265754e9cdf68022745_417x677.png) ### 多个 trait 通过逗号分隔,在`use`声明列出多个 trait,可以都插入到一个类中。 ![](https://img.kancloud.cn/1b/09/1b09e7857234df0dbbf8b68326551c84_482x867.png) ### 冲突的解决 如果两个 trait 都插入了一个同名的方法,如果没有明确解决冲突将会产生一个致命错误。 为了解决多个 trait 在同一个类中的命名冲突,需要使用`insteadof`操作符来明确指定使用冲突方法中的哪一个。 以上方式仅允许排除掉其它方法,`as`操作符可以 为某个方法引入别名。 注意,`as`操作符不会对方法进行重命名,也不会影响其方法。 在本例中 Talker 使用了 trait A 和 B。由于 A 和 B 有冲突的方法,其定义了使用 trait B 中的 smallTalk 以及 trait A 中的 bigTalk。 Aliased\_Talker 使用了`as`操作符来定义了`talk`来作为 B 的 bigTalk 的别名。 ![](https://img.kancloud.cn/c6/fc/c6fc3ddbbafa575171f31b3647c7f1c3_424x733.png) ![](https://img.kancloud.cn/77/a2/77a2be61de657db11dbb5149035c8bce_393x210.png) ### 修改方法的访问控制 ![](https://img.kancloud.cn/df/c4/dfc40ea19f833cd70ebd7da1859933c5_643x551.png) ### 从 trait 来组成 trait 在 trait 定义时通过使用一个或多个 trait,能够组合其它 trait 中的部分或全部成员。 ![](https://img.kancloud.cn/80/5d/805d086e8be9aff8eef2e7972886f428_428x879.png) ### Trait 的静态成员 #### 静态变量 ![](https://img.kancloud.cn/c5/19/c519606d89f4edaa778446dbb7f37859_497x603.png) #### 静态方法 ![](https://img.kancloud.cn/87/04/8704ab4ba840098d6bc23cfb09b9ec8d_485x412.png) #### 静态属性 ![](https://img.kancloud.cn/5b/d9/5bd9214f423c319c34d1797907c6b37a_410x346.png)