最近我一直在努力学习PHP,我发现自己被trait缠住了。我理解横向代码重用的概念,并且不希望必然地继承抽象类。我不明白的是:使用特征和使用界面之间的关键区别是什么?

我曾试着搜索过一篇像样的博客文章或文章,解释什么时候使用其中一种或另一种,但到目前为止,我找到的例子似乎非常相似,甚至完全相同。


当前回答

该特征与我们可以用于多重继承目的和代码可重用性的类相同。

我们可以在类中使用trait,也可以在同一个类中使用'use keyword'来使用多个trait。

接口用于代码可重用性与特性相同

接口是扩展多个接口,所以我们可以解决多个继承问题,但当我们实现接口时,我们应该在类中创建所有的方法。 欲了解更多信息,请点击以下链接:

http://php.net/manual/en/language.oop5.traits.php http://php.net/manual/en/language.oop5.interfaces.php

其他回答

trait只是为了代码重用。

Interface只是提供了要在类中定义的函数的签名,它可以根据程序员的判断使用。这样就为我们提供了一组类的原型。

供参考, http://www.php.net/manual/en/language.oop5.traits.php

接口定义了实现类必须实现的一组方法。

当trait被使用时,方法的实现也会出现——这在接口中不会发生。

这是最大的不同。

PHP RFC的水平重用:

trait是一种在单继承语言(如PHP)中代码重用的机制。Trait旨在通过允许开发人员在不同类层次结构中的几个独立类中自由地重用方法集来减少单个继承的一些限制。

该特征与我们可以用于多重继承目的和代码可重用性的类相同。

我们可以在类中使用trait,也可以在同一个类中使用'use keyword'来使用多个trait。

接口用于代码可重用性与特性相同

接口是扩展多个接口,所以我们可以解决多个继承问题,但当我们实现接口时,我们应该在类中创建所有的方法。 欲了解更多信息,请点击以下链接:

http://php.net/manual/en/language.oop5.traits.php http://php.net/manual/en/language.oop5.interfaces.php

对于初学者来说,上面的答案可能很难,下面是最简单的理解方法:

特征

trait SayWorld {
    public function sayHello() {
        echo 'World!';
    }
}

所以如果你想在其他类中使用sayHello函数,而不需要重新创建整个函数,你可以使用trait,

class MyClass{
  use SayWorld;

}

$o = new MyClass();
$o->sayHello();

酷吧!

不只是函数,你可以使用trait中的任何东西(function, variables, const…)你也可以使用多个trait: SayWorld, AnotherTraits;

接口

  interface SayWorld {
     public function sayHello();
  }

  class MyClass implements SayWorld { 
     public function sayHello() {
        echo 'World!';
     }
}

因此,这就是接口与特征的不同之处:您必须在实现的类中重新创建接口中的所有内容。接口没有实现,接口只能有函数和常量,不能有变量。

我希望这能有所帮助!

如果你懂英语,知道trait的意思,它就是这个名字的意思。它是一个无类的方法和属性包,您可以通过输入use将其附加到现有类。

基本上,你可以将它与单个变量进行比较。闭包函数可以从作用域外部使用这些变量,这样它们就有了作用域内部的值。他们是强大的,可以在任何地方使用。如果trait被使用,也会发生同样的情况。