背景
本文已收錄于PHP全棧系列專欄:PHP面試專區(qū)。
計(jì)劃將全覆蓋PHP開發(fā)領(lǐng)域所有的面試題,對(duì)標(biāo)資深工程師/架構(gòu)師序列
,歡迎大家提前關(guān)注鎖定。
記得多年前面試的時(shí)候被面試官問到Trait,當(dāng)時(shí)一臉懵,其實(shí)現(xiàn)在它在各個(gè)項(xiàng)目或者框架中已經(jīng)被廣泛使用,主要也是為了對(duì)現(xiàn)有的單繼承和interface進(jìn)行一個(gè)更加靈活的補(bǔ)充。今天文章就介紹一下它。先收藏,面試不迷路哈。
一、關(guān)于繼承和接口
在介紹PHP中的Trait之前,我們需要先了解一下PHP中的繼承和接口。
1.1 繼承
繼承是面向?qū)ο缶幊痰闹匾拍钪?,它允許子類繼承父類的屬性和方法,并且可以在子類中覆蓋或者擴(kuò)展父類的方法。
例如:
class Animal {
public function eat() {
echo "Animal is eating";
}
}
class Cat extends Animal {
public function meow() {
echo 'Meow! ';
}
}
$cat = new Cat();
$cat->meow(); // output: Meow!
$cat->eat(); // output: Animal is eating
1.2 接口
接口是指定類應(yīng)該實(shí)現(xiàn)哪些方法的一種規(guī)范,接口中只包含方法簽名,而不包含具體的實(shí)現(xiàn)。實(shí)現(xiàn)接口的類必須實(shí)現(xiàn)接口中定義的所有方法。
例如:
interface Shape {
public function area();
}
class Circle implements Shape {
private $radius;
function __construct($radius) {
$this->radius = $radius;
}
public function area(){
return pi() * pow($this->radius,2);
}
}
$circle = new Circle(10);
echo $circle->area(); // output: 314.15926535898
二、Trait
2.1 Trait 是什么
Trait是PHP5.4引入的新特性,它允許我們?cè)诓皇褂美^承的情況下,將一組方法插入到一個(gè)類中。
Trait可以被多個(gè)類使用,這意味著我們可以在多個(gè)類中復(fù)用同一個(gè)Trait中的方法,這種方式比繼承更加靈活。
Trait的語法非常簡單,定義一個(gè)Trait的方式與定義一個(gè)類類似,但是將關(guān)鍵字“class”替換成“trait”。
示例:
trait Hello {
public function sayHello() {
echo "Hello";
}
}
class MyClass {
use Hello;
public function sayWorld() {
echo "World";
}
}
$obj = new MyClass();
$obj->sayHello(); // output: Hello
$obj->sayWorld(); // output: World
在這個(gè)例子中,我們定義了一個(gè)名為Hello的Trait,它包含一個(gè)名為sayHello的方法。然后我們定義了一個(gè)MyClass類,它使用了HelloTrait?,F(xiàn)在MyClass類擁有了sayHello方法,我們可以直接在MyClass類中調(diào)用sayHello方法。
我們還可以在Trait中使用屬性,就像在類中一樣:
trait Greet {
protected $greet = 'Hello';
public function sayGreet() {
echo $this->greet;
}
}
Trait中的屬性會(huì)像類中的屬性一樣被繼承到使用Trait的類中。
class MyClass {
use Greet;
public function sayHello() {
echo $this->greet . ' World!';
}
}
$obj = new MyClass();
$obj->sayHello(); // output: Hello World!
$obj->sayGreet(); // output: Hello
2.2 Trait的作用
Trait的主要作用是代碼復(fù)用,它允許我們將一組方法插入到多個(gè)類中,達(dá)到代碼復(fù)用的目的。
Trait還可以解決PHP單繼承的問題。在PHP中,類只能繼承自一個(gè)父類,但是有時(shí)候我們需要繼承自多個(gè)父類以獲取更多的方法。Trait提供了一種解決方案,我們可以使用多個(gè)Trait來為類添加多個(gè)父類的方法。
Trait還可以解決代碼冗余的問題。當(dāng)我們?cè)诙鄠€(gè)類中重復(fù)定義相同的方法時(shí),我們可以將這些方法提取出來,定義在一個(gè)Trait中,并在需要使用這些方法的類中使用Trait。文章來源:http://www.zghlxwxcb.cn/news/detail-498188.html
總結(jié)
本文介紹了PHP中的Trait,主要包括Trait的語法和Trait的作用,Trait在PHP開發(fā)過程中非常實(shí)用,它能夠提高代碼的復(fù)用性和可維護(hù)性,避免代碼的冗余,建議在實(shí)際開發(fā)中結(jié)合項(xiàng)目的情況利用它來提升代碼質(zhì)量。文章來源地址http://www.zghlxwxcb.cn/news/detail-498188.html
到了這里,關(guān)于【面試題06】Trait是什么,有什么作用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!