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

Zil*_*ilk 5 php oop constructor traits

在PHP 5.4.9中,以下示例触发致命错误"B具有来自traits的碰撞构造函数定义".

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

class A {
    use T;
}

class B extends A {
    use T;
}
Run Code Online (Sandbox Code Playgroud)

当trait包含与构造函数不同的方法时没有问题,并且当构造函数实际复制到类中时没有问题(不使用特征,"语言辅助复制和粘贴"功能).

这里的构造函数有什么特别之处?PHP不应该弄清楚其中一个会覆盖另一个吗?我在手册中找不到任何有关此限制的内容.

这个相关问题提到了解决问题的方法(通过使用特征方法的别名),但不是首先导致它的原因.

hak*_*kre 3

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

class A {
    use T;
    use T;
}
Run Code Online (Sandbox Code Playgroud)

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

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

如果仅在子类中需要它,则仅在叶子类中使用它。

  • 好吧,这*是*构造函数。http://lxr.php.net/xref/PHP_5_4/Zend/zend_compile.c#3650 / http://lxr.php.net/xref/PHP_5_4/Zend/zend_compile.c#3675 ​​- 这*是*魔法与方法相关,只是构造函数是这些魔术方法中的一个特殊方法。这可能是为了安全,这样 PHP 的运行时就不会中断(而不是代码的安全)。 (2认同)