首頁  >  文章  >  後端開發  >  PHP如何多繼承

PHP如何多繼承

(*-*)浩
(*-*)浩原創
2019-09-20 14:20:192770瀏覽

PHP如何多繼承

記得有一道面試題問php是否支援多重繼承?

答案:不可以,只支援單繼承。

如何實現多繼承呢?

答案:可以使用 interface 或 trait 實作 。 (推薦學習:PHP程式設計從入門到精通

為什麼會想到這個問題,因為想到如果類別繼承多個接口,然後他們之間還有相同的屬性和方法會引用誰的方法或屬性,誰又會被覆寫?

總結:

1.使用interface 宣告類別不能被實例化,且屬性必須是常數,方法不能有方法體

2. trait 宣告的類別不能被實例化,由use引入,會覆蓋父類別的相同屬性及方法,如果有多個use,那麼按順序下面的覆蓋最上面的相同的屬性及方法

接口是什麼?

使用介面(interface),可以指定某個類別必須實作哪些方法,但不需要定義這些方法的具體內容。

介面是透過 interface 關鍵字來定義的,就像定義一個標準的類別一樣,但其中定義所有的方法都是空的。

介面中定義的所有方法都必須是公有,這是介面的特性。

trait是什麼?

看上去既像類別又像接口,其實都不是,Trait可以看做類別的部分實現,可以混入一個或多個現有的PHP類別中,

其作用有兩個:表示類別可以做什麼;提供模組化實作。

Trait是一種程式碼重複使用技術,為PHP的單一繼承限制提供了一套靈活的程式碼重複使用機制。

Trait為了減少單繼承語言的限制,使開發人員能夠自由地在不同層次結構內獨立的類別復用method. Trait 和Class 組合的語義定義了一種減少複雜性的方式,避免傳統的多重繼承和Mixin 類別相關典型問題。

Trait 和 Class 相似,但只是旨在以細粒度和一致的方式來組合功能。無法透過 trait 自身來實例化。它為傳統繼承增加了水平特性的組合;也就是說,應用的幾個 Class 之間不需要繼承。

優先權

從基底類別繼承的成員被 trait 插入的成員所覆寫。優先順序是來自目前類別的成員覆寫了 trait 的方法,而 trait 則覆寫了被繼承的方法。

class Base {
    public function sayHello() {
        echo 'Hello ';
    }
}
trait SayWorld {
    public function sayHello() {
        parent::sayHello();
        echo 'World!';
    }
}
class MyHelloWorld extends Base {
    use SayWorld;

}
$o = new MyHelloWorld();
$o->sayHello();

透過逗號分隔,在 use 宣告列出多個 trait,可以都插入到一個類別中。

以上是PHP如何多繼承的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn