Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中Traits的可能使用场景是什么?_Php_Oop_Traits - Fatal编程技术网

PHP中Traits的可能使用场景是什么?

PHP中Traits的可能使用场景是什么?,php,oop,traits,Php,Oop,Traits,可能重复: 在什么样的情况下,人们会在PHP中使用Traits?我对此有一个很好的总体想法,但我似乎想不出在我编写的应用程序中使用它们的方法,但这可能是因为它当时不需要特性 我已经意识到一个场景需要具备以下特征: 事件。与其让一个类实现观察器模式并让所有其他类继承它,不如让它成为一个trait,让想要触发事件或订阅的类使用该trait。例如,Yii框架在CComponent类中实现东西而不是使用特征,这是错误的 基本上,可以在类之间共享,但可能沿着多个类层次结构传播的功能应该使用特性。除了

可能重复:

在什么样的情况下,人们会在PHP中使用Traits?我对此有一个很好的总体想法,但我似乎想不出在我编写的应用程序中使用它们的方法,但这可能是因为它当时不需要特性

我已经意识到一个场景需要具备以下特征:

  • 事件。与其让一个类实现观察器模式并让所有其他类继承它,不如让它成为一个trait,让想要触发事件或订阅的类使用该trait。例如,Yii框架在CComponent类中实现东西而不是使用特征,这是错误的

基本上,可以在类之间共享,但可能沿着多个类层次结构传播的功能应该使用特性。除了事件系统之外,还有什么其他场景可以利用Traits呢?

Traits解决的问题与Java使用接口解决的问题类似——如何在不在同一类层次结构中的类之间强制实施共同行为(由接口表示)

使用C++语言,这些语言只有继承,对于两个不同类的两个对象,在相同的上下文中使用相同的行为,这两个类必须来自同一个层次。这有时意味着创建相当人工的层次结构,以便允许在同一上下文中使用来自不同类的对象

Java通过接口解决了这个问题——接口本质上是一个管理行为提供的契约,因此一个类的对象可以替代另一个类的对象,因为它承诺了相同的行为——接口。但他们不必来自同一个层级


PHP特性体现了这一理念。trait是一种接口,是类包含的一组行为,以便可以在需要该行为的上下文中使用。因此,任何Java接口示例都应该继承到PHP接口示例。不过,PHP Traits与Java接口有点不同,因为Traits可以包含完整的函数定义,而Java接口只能包含声明(典型的PHP特性!)

PHP也有,与Traits分开。。。!如果你想把苹果和苹果进行比较,特征就像来自Ruby等语言的混合体,或者来自Self等语言的特征。我认为接口与特征没有多大关系。我将把这个留在这里只是为了跟进我的评论。关于PHP同时具有接口和特性,您是对的,但是使用类的代码无法区分来自接口的内容、来自特性的内容和来自类本身的内容。从这个角度来看,trait只不过是一个带有自己实现的接口。在我看来,Traits无论如何都不是一个好主意,因为它们增加了依赖性——而且没有什么好处,因为它们的应用有限。例如,它们不能访问对象状态。它们可以,但不能直接访问。您可以使用抽象方法来实现这一点。任何使用trait的类都必须实现trait工作所需的定义的抽象getter/setter/任何其他状态访问函数。这个场景的特点是抽象方法类似于接口。