【发布时间】:2013-12-21 08:13:58
【问题描述】:
更新:我并不孤单地思考这个问题,看来这确实是一个错误。见here。修复的那一天将是美好的一天! :)
最初是I love PHP traits! I'm going to use them everywhere! ^_^,现在变成了Thought Exercise / Learning Experience >_<。
考虑以下示例:
trait TheErrorOfYourWays{
public function booboo(){
echo 'You had a booboo :(';
}
}
trait SpectacularStuff1 {
use TheErrorOfYourWays;
}
trait SpectacularStuff2 {
use TheErrorOfYourWays;
}
class DoSomethingSpectacular {
use SpectacularStuff1, SpectacularStuff2;
}
这导致(显然不那么明显):
致命错误:尚未应用特征方法 booboo,因为与 DoSomethingSpectacular 上的其他特征方法发生冲突。
所以我的问题是:如何解决特征中的方法冲突?是否有可能实现重叠特征“继承”?如果是这样,这样做的“正确”方法是什么?
我为什么要这样做:
- 我想创建 自包含 特征和类(混搭风格)。 如果可能的话,我想说“使用”,然后神奇的事情必须发生。不必摸不着头脑去想,“现在那个特性又出现在什么命名空间中了?”等等等等。
- 当我做一些“冒险”的事情并发现我无意中造成了冲突时,无需即时编辑类和特征。
- 当时似乎是个好主意。
我尝试过的:
- PHP 手册。
- 谷歌。
- 所以包括this question -> 不是这种情况的正确答案。
- Found this 但我使用的是 PHP 5.5.1 版。它是固定的,对吧?对吧?
-
一系列奇妙的“as”、别名,甚至代替,在不同的地方、时间、宇宙等。包括但不限于:
trait SpectacularStuff1 { use TheErrorOfYourWays{ TheErrorOfYourWays::booboo as booboo1; } } trait SpectacularStuff2 { use TheErrorOfYourWays{ TheErrorOfYourWays::booboo as booboo2; } } class DoSomethingSpectacular { use SpectacularStuff1, SpectacularStuff2 { /* Tried separately, but included here for brevity's sake */ SpectacularStuff1::booboo as booboo3; SpectacularStuff2::booboo as booboo4; } }与
use TheErrorOfYourWays as Erroneous1; trait SpectacularStuff1 { use Erroneous1{ Erroneous1::booboo as booboo1; } } use TheErrorOfYourWays as Erroneous2; trait SpectacularStuff2 { use Erroneous2{ Erroneous2::booboo as booboo2; } }
我明白:
- 我可以将 TheErrorOfYourWays 更改为一个类并将 booboo() 设为静态,但我想了解这个特定的 trait 行为。
- 我可以从特征中删除 TheErrorOfYourWays 并在类中使用它,但这几乎不是“独立的”。每次我使用这些特征时,我都必须记住在课堂上使用 TheErrorOfYourWays,即使我没有直接从课堂上调用 booboo()。听起来很危险。
- 我可能犯了一些新手语法错误,或者无法深入理解别名。如果是这样,请......解释......慢慢......
- 可能有更好的方法来做到这一点。如果是这样,请......解释......慢慢......
- 我可能过早地热情,PHP 还没有做到这一点。让我轻轻放下。
谢谢!
【问题讨论】:
标签: php class multiple-inheritance traits