PHP是一種很流行的編程語言,它支持重載(overloading)以及覆蓋(override)的概念。這兩種操作在PHP的面向?qū)ο缶幊谭矫婧苤匾驗(yàn)樗鼈兛梢詭椭覀兏觾?yōu)雅地組織和擴(kuò)展我們的代碼。
在這篇文章中,我們將主要討論P(yáng)HP中的覆蓋(override)功能。在覆蓋(override)中,我們可以定義一個(gè)父類函數(shù),并在子類中定義一個(gè)同名函數(shù)來重寫父類函數(shù)。這樣做的好處在于,我們可以自定義實(shí)現(xiàn)子類函數(shù),并且在需要的時(shí)候,可以使用父類函數(shù)中的所有功能。
class Person{ function show(){ echo "I am Person"; } } class Student extends Person{ function show(){ echo "I am Student"; } } $p = new Person(); $p->show(); // 輸出:I am Person $s = new Student(); $s->show(); // 輸出:I am Student
在上面的代碼中,我們定義了一個(gè)Person類和一個(gè)Student類,其中Student類擴(kuò)展了Person類。我們還定義了一個(gè)show函數(shù),這個(gè)函數(shù)在Person類中輸出“I am Person”,在Student類中輸出“I am Student”。當(dāng)我們創(chuàng)建Person對(duì)象并調(diào)用show函數(shù)時(shí),輸出“I am Person”;當(dāng)我們創(chuàng)建Student對(duì)象并調(diào)用show函數(shù)時(shí),輸出“I am Student”。
讓我們深入探討一下覆蓋(override)的概念。首先,我們需要明確的是,在PHP中,子類的方法可以訪問父類的方法。我們可以使用父類中的任何公共、受保護(hù)和私有方法。
class Person{ protected $name; function __construct($name){ $this->name = $name; } function sayHello(){ echo "Hello, my name is {$this->name}"; } } class Student extends Person{ function sayHello(){ parent::sayHello(); echo ", and I am a student."; } } $s = new Student("Tom"); $s->sayHello(); // 輸出:Hello, my name is Tom, and I am a student.
在上面的代碼中,我們定義了一個(gè)Person類和一個(gè)Student類,其中Student類擴(kuò)展了Person類。我們還定義了一個(gè)構(gòu)造函數(shù)和一個(gè)sayHello函數(shù),構(gòu)造函數(shù)在父類中定義,sayHello函數(shù)在子類中定義。在子類的sayHello函數(shù)中,我們先調(diào)用了父類的sayHello函數(shù),并且在輸出字符串的后面添加了一些自己定義的內(nèi)容。
我們使用了parent::sayHello來調(diào)用父類的sayHello函數(shù)。這種語法非常有用,因?yàn)樗试S我們?cè)谧宇惙椒ㄖ惺褂酶割惙椒ǖ乃泄δ埽⒏鶕?jù)需要進(jìn)行自定義。
在這篇文章中,我們已經(jīng)介紹了PHP中覆蓋(override)的概念。除此之外,覆蓋(override)還可以用來實(shí)現(xiàn)接口或抽象方法,并且還可以用來覆蓋(override)魔術(shù)方法、靜態(tài)方法和類屬性。這些內(nèi)容將在以后的文章中進(jìn)行詳細(xì)講解。