php - 特征中的构造函数定义如何冲突?

标签 php oop constructor traits

在 PHP 5.4.9 中,以下示例触发了 fatal error “B has colliding constructor definitions coming from traits”

trait T {
    public function __construct () {
        echo __CLASS__ . ": constructor called.\n";
    }
}

class A {
    use T;
}

class B extends A {
    use T;
}

当 trait 包含与构造函数不同的方法时没有问题,当构造函数实际复制到类中时也没有问题(不使用 traits,即“语言辅助复制和粘贴”功能)。

这里的构造函数有什么特别之处? PHP 不应该能够弄清楚其中一个覆盖另一个吗?我找不到关于此限制的任何信息 in the manual .

This related question提到了一种解决问题的方法(通过为特征方法使用别名),但没有首先提到导致问题的原因。

最佳答案

尝试使用以下代码会发生什么:

class A {
    use T;
    use T;
}

因为这是您通过从 A 扩展然后再次使用 T 为 B 有效编写的内容。

如果您需要在基类和子类中使用特征 T,请仅在基类中使用它。

如果您只在子类中需要它,请只在叶子类中使用它。

关于php - 特征中的构造函数定义如何冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18476798/

相关文章:

php - 如何处理来自支付网关的响应数据?

c++ - 对象创建的特殊方式?

c++ - 如何在 C++ 中显式实例化模板构造函数?

c++ - 如何避免在 C++ 的派生类中重复基类构造函数参数?

php - 算法 - 多个研讨会和时间框架之间的理想分配

php - 验证电子邮件确认

oop - Kent Beck 的《测试驱动开发示例》中的示例

c# - 有没有办法用自己发起一个类?

php - 可作为链接点击的行

matlab - 常量属性中方法的函数句柄