gpt4 book ai didi

PHP 特征方法冲突 : trait "inheritance" and trait hierarchies

转载 作者:IT王子 更新时间:2023-10-28 23:45:45 25 4
gpt4 key购买 nike

更新:不止我一个人在思考这个问题,看来这确实是一个错误。参见 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;
}

这导致( 很明显 不那么明显):

Fatal error: Trait method booboo has not been applied, because there are collisions with other trait methods on DoSomethingSpectacular.

所以我的问题是:如何解决特征中的方法冲突?是否有可能实现重叠的特征“继承”?如果是这样,执行此操作的“正确”方法是什么?

我为什么要这样做:

  1. 我想创建自包含 特征和类(混搭风格)。 如果可能,我想说“使用”,然后一定会发生神奇的事情。无需挠头思考,“现在那个特征又出现在哪个 namespace 中?”等等。
  2. 当我做一些“冒险”的事情并发现我无意中制造了冲突时,无需即时编辑类和特征。
  3. 当时看来是个好主意。

我尝试过的:

  1. PHP 手册。
  2. 谷歌。
  3. SO 包括 this question -> 不是这种情况的正确答案。
  4. Found this但我使用的是 PHP 5.5.1 版。它是固定的,对吧?对吧?
  5. 奇异的“as”、别名,甚至 insteadof,在不同的地方、时间、宇宙等。包括但不限于:

    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;
    }
    }

我明白:

  1. 我可以将 TheErrorOfYourWays 更改为类并将 booboo() 设为静态,但我想了解此特定特征行为。
  2. 我可以从特征中删除 TheErrorOfYourWays 并在类里面使用它,但这很难“独立”。每次我使用特性时,我都必须记住在类中使用 TheErrorOfYourWays,即使我不直接从类中调用 booboo() 也是如此。听起来很危险。
  3. 我可能犯了一些菜鸟语法错误,或者未能深入理解别名。如果是这样,请...解释...慢慢...
  4. 可能有更好的方法来做到这一点。如果是这样,请...解释...慢慢...
  5. 我的热情可能过早,而 PHP 还没有做到这一点。轻轻地让我下来。

谢谢!

最佳答案

需要使用关键字insteadof来解决Traits中的冲突。

Source

重写你的

class DoSomethingSpectacular {
use SpectacularStuff1, SpectacularStuff2 {
/* Tried separately, but included here for brevity's sake */
SpectacularStuff1::booboo as booboo3;
SpectacularStuff2::booboo as booboo4;
}
}

class DoSomethingSpectacular {
use SpectacularStuff1, SpectacularStuff2
{
SpectacularStuff1::booboo insteadof SpectacularStuff2;
SpectacularStuff2::booboo insteadof SpectacularStuff1;
}
}

将解决冲突。

关于PHP 特征方法冲突 : trait "inheritance" and trait hierarchies,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20382202/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com