36

我有一个特质。为了创意起见,我们称这个 trait Trait:

trait Trait{    
    static function treat($instance){    
        // treat that trait instance with care
    }
}

现在,我还有一个使用这个特性的类,用户。当尝试使用 User 实例调用 Treat 时,一切正常。但我想键入提示,只有使用 Trait 的类的实例才应该作为参数给出,如下所示:

static function treat(Trait $instance){...}

遗憾的是,这导致了一个致命错误,表明该函数需要一个 Trait 实例,但给出了一个 User 实例。这种类型的类型提示非常适合继承和实现,但是我如何对特征进行类型提示呢?

4

4 回答 4

19

你不能像 DaveRandom 说的那样。你不应该。您可能希望在其上实现一个接口和类型提示。然后,您可以使用 trait 实现该接口。

于 2013-01-04T13:10:56.737 回答
10

对于将来在这里结束的人,我想详细说明吠陀的答案。

  1. 确实,您不能将特征视为 PHP 中的特征(具有讽刺意味),说您期望具有某些特征的对象只能通过接口(本质上是抽象特征的集合)实现
  2. 其他语言(例如 Rust)实际上鼓励使用特征进行类型提示

综上所述; 你的想法不是一个疯狂的!实际上,将特征视为单词的常识是很有意义的,而其他语言就是这样做的。由于某种原因,PHP 似乎卡在了接口和特征之间。

于 2019-10-04T11:37:50.270 回答
3

如果您想在 trait 或使用该 trait 的类中创建函数,您可以将self其用作类型提示,以便您的函数看起来像这样。

static function treat(self $instance){...}
于 2020-12-12T13:06:22.923 回答
1

试试这个:

    /**
     * @param Trait $instance
     */
    static function treat($instance){
    }

这适用于 Intellij Idea,但是无论如何您的示例没有多大意义,特征不是类或接口,它只是代码的一部分,可以获取您使用它的地方,所以不要这样做,使用父类例如,使用这些特征可能是您正确的解决方案。

但是我上面写的那段代码可以工作,我得到了自动完成。

于 2021-11-30T09:07:02.987 回答