Heim > Artikel > Backend-Entwicklung > Ausführliche Erklärung, wie Trait zur Lösung des Einzelvererbungsproblems in PHP verwendet wird
Wie kann man den Fluch der Einzelvererbung in PHP brechen? Der folgende Artikel stellt Ihnen vor, wie Sie Trait zur Lösung des Einzelvererbungsproblems in PHP verwenden können. Ich hoffe, er wird Ihnen hilfreich sein.
Wir alle wissen, dass PHP eine einzige Vererbungssprache ist, aber manchmal haben unsere beiden Klassen, die nichts mit dem Geschäft zu tun haben, ähnliche Verhaltensweisen. Wie können wir DRY (Don't Repeat Yourself) elegant erreichen?
Die Antwort ist die Einführung von Trait
Trait
Trait是PHP 5.4引入的新概念,看上去既像类又像接口。【推荐学习:《PHP视频教程》】
其实都不是,Trait可以看做类的部分实现,可以混入一个或多个现有的PHP类中。
Trait是一种代码复用技术,为PHP的单继承限制提供了一套灵活的代码复用机制。
Trait作用
表明类可以做什么;
提供模块化实现。
开篇我就提到了PHP是单继承语言
,我们通常的习惯是:
先编写一个通用的基类,实现基本的功能,进行通用逻辑的封装,然后扩展这个基类;
然后再创建更具体的子类,直接从父类继承实现。
这叫方式就是单继承层次结构,很多编程语言都使用这个模式。
大多数时候这种典型的继承模型能够良好运作,但是如果想让两个无关的PHP类具有类似的行为,应该怎么做呢?
我查询了Laravel的源码,以自带的LoginController
为例,其中的登录认证就是通过Trait实现:
创建Trait很简单,跟创建类有点类似,只不过使用的关键字是trait
而不是class
,以上述的AuthenticatesUsers
为例:
我们通过trait
声明定义的是一个Trait,然后我们可以在这个Trait中像类一样定义要使用的属性和方法。
此外Trait支持嵌套和组合,即通过一个或多个Trait(多个用,分隔)组合成一个Trait,比如AuthenticatesUsers
就是如此:
注意:Trait中还支持定义抽象方法和静态方法,其中抽象方法必须在使用它的类中实现。
调用方法的优先级:
调用类>Trait>父类(如果有的话),方法可以覆盖,但属性不行。
注意:如果Trait中定义了一个属性,如果调用类中也定义这个属性则会报错。
Trait的使用方法也很简单,上面的截图示例中已经显示的很清楚明了:使用use
关键字。
注意:命名空间和Trait使用的都是use
关键字引入,不同之处在于导入位置,命名空间在类的定义体外导入,而Trait在类的定义体内导入。
如果Trait和引用Trait的类有相同的属性和方法,我们再外部调用时需要使用instansof
"]
Tatsächlich ist es so Ist weder das eine noch das andere, können Traits als Teilimplementierungen von Klassen angesehen werden, die in eine oder mehrere vorhandene PHP-Klassen gemischt werden können. Trait ist eine Code-Wiederverwendungstechnologie, die einen flexiblen Code-Wiederverwendungsmechanismus für die Einzelvererbungsbeschränkung von PHP bietet.
🎜Merkmalsfunktion🎜PHP eine einzelne Vererbungssprache ist
. Unsere übliche Gewohnheit ist: 🎜LoginController
als Beispiel genommen. Die Anmeldeauthentifizierung wird durch Trait implementiert: 🎜🎜🎜trait
anstelle von class
ist als Beispiel: 🎜🎜🎜🎜 Was wir durch die trait
-Deklaration definieren, ist ein Trait, und dann können wir die Eigenschaften und Methoden definieren, die in diesem Trait wie in einer Klasse verwendet werden sollen. 🎜🎜Darüber hinaus unterstützen Traits die Verschachtelung und Kombination, d. h. ein oder mehrere Traits (mehrere werden durch getrennt) werden zu einem Trait zusammengefasst, z. B. AuthenticatesUsers
: 🎜🎜🎜🎜Hinweis: Trait unterstützt auch Definitionen Abstrakte Methoden und statische Methoden, wobei eine abstrakte Methode in der Klasse implementiert werden muss, die sie verwendet. 🎜🎜Priorität der aufrufenden Methode: 🎜🎜Aufrufende Klasse>Eigenschaft>Übergeordnete Klasse (falls vorhanden), Methoden können überschrieben werden, Attribute jedoch nicht. 🎜🎜Hinweis: Wenn ein Attribut in Trait definiert ist, wird ein Fehler gemeldet, wenn dieses Attribut auch in der aufrufenden Klasse definiert ist. 🎜use
Schlüsselwörter. 🎜use
eingeführt. Der Unterschied liegt im Importort, Namespaces werden außerhalb der Klassendefinition importiert, während Merkmale innerhalb der Klassendefinition importiert werden. 🎜🎜🎜instansof
verwenden, um anzugeben, dass das Methode ist eine Klasse, wenn sie extern aufgerufen wird. Es ist immer noch Trait. 🎜🎜Da der PHP-Interpreter Traits während der Kompilierung in den Definitionskörper der Klasse kopiert, die durch diesen Vorgang verursachten Inkompatibilitätsprobleme jedoch nicht behandelt, müssen wir die Kompatibilitätsprobleme lösen. 🎜🎜Weitere Kenntnisse zum Thema Programmierung finden Sie unter: 🎜Programmierunterricht🎜! ! 🎜
Das obige ist der detaillierte Inhalt vonAusführliche Erklärung, wie Trait zur Lösung des Einzelvererbungsproblems in PHP verwendet wird. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!