PHP中的trait,interface和abstract
阿新 • • 發佈:2018-12-17
<?php trait MyTrait { protected $var = "MyTrait_var"; protected $var1 = "MyTrait_var"; function __construct() { echo $this->var.PHP_EOL; } function a() { echo "a".PHP_EOL; } } interface MyInterface { function __construct(); function b(); } abstract class MyAbstract { protected $var2 = "MyAbstract_var"; use MyTrait; function b() { echo "b".PHP_EOL; } } class MyClass extends MyAbstract implements MyInterface { protected $var3 = "MyClass_var"; //也可以在這裡引用,不區分繼承關係 //use MyTrait; function c() { echo "c".PHP_EOL; } } $class = new MyClass(); $class->a(); $class->b(); $class->c();
輸出結果為:
MyTrait_var
a
b
c
以上程式碼中,
MyAbstract
中的function b()
也可以放在MyClass
中,或者由MyAbstract
實現介面MyInterface
。
trait
看上去更像是為了程式碼的複用而寫的一個小外掛,它類似於include
,可以用use
放在類中間,讓trait
裡面定義的方法作為class
的一部分,本身不能直接例項化。interface
裡面的方法都是虛擬的,需要在繼承的時候對這些方法進行重定義。也就是說,方法是說明性質的,並沒有實際操作,而你在繼承的時候,需要實現這些方法,不然就會出錯,而且不能缺失。interface
經常用於架構的時候,對一個例項所擁有的屬性和方法進行抽象定義。簡單來講類似一個協議,是老闆下達的任務。你要繼承的話,必須滿足這個協議,也就是完成老闆下達的任務。abstract
:當abstract
作用於某個類時,此類被限定為抽象類,只能用於繼承,而無法例項化物件。抽象類不一定含有抽象方法,但抽象方法一定存在於抽象類中,且繼承此抽象類的子類必須全部實現其抽象方法,否則,子類也要標識為抽象類。抽象方法是必須被子類繼承實現的,所以不可以用private
修飾符去限定abstract
抽象方法,可以用public
和protected
去修飾。