php中介面、抽象類別、Final、Static例子

來源:互聯網
上載者:User

1. 介面
(1)對介面的使用是通過關鍵字implements
(2)介面不能定義成員變數(包括類靜態變數),能定義常量
(3)子類必須實現介面定義的所有方法
(4)介面只能定義不能實現該方法
(5)介面沒有建構函式
(6)介面中的方法和實現它的類預設都是public類型的
2. 抽象類別
(1)對抽象類別的使用是通過關鍵字extends
(2)不能被執行個體化,可以定義子類必須實現的方法
(3)子類必須定義父類中的所有抽象方法,這些方法的存取控制必須和父類中一樣(或者更為寬鬆)
(4)如一個類中有一個抽象方法,則該類必須定義為抽象類別
(5)抽象類別可以有建構函式
(6)抽象類別中的方法可以使用private,protected,public來修飾。
(7)一個類可以同時實現多個介面,但一個類只能繼承於一個抽象類別。
3. Final類/方法
(1)final類不能被繼承
(2)final方法不能被重寫
4. Static類/方法
(1)可以不執行個體化類而直接存取
(2)靜態屬性不可以由對象通過->操作符來訪問,用::方式調用

例子

<?php
# 介面
interface Human{
    const TEST_CONST = "test const"; // 定義常量
    // public $v; // error,不能定義變數
    // static $count; // error,不能定義變數
    public function speak();
    public function walk();
    public function run();
}
    
# 抽象類別
abstract class Father implements Human{
    
    public function __construct(){
        echo "father init n";
    }
    
    abstract public function walk(); // 抽象方法
    
    public function speak(){
        echo "father speak skill n";
    }
    
    public function run(){
        echo "father run skill n";
    }
}
    
# 非抽象類別
class Mother implements Human{
    
    public function __construct(){
        echo "mother init n";
    }
    
    # 這裡必須實現walk方法
    public function walk(){
        echo "mother walk skill n";
    }
    
    public function speak(){
        echo "mother speak skill n";
    }
    
    public function run(){
        echo "mother run skill n";
    }
}
    
class Son extends Father{
    
    public function walk(){
        echo "son walk skill. n";
    }
    
    public function speak($name = ''){
        echo "son: ". $name ." speak skill. n";
    }
    
    # 存取控制必須和父類中一樣(或者更為寬鬆)
    protected function sport(){
        echo "son sport skill. n";
    }
    
    final public function notTeach(){
        echo 'son has not to teach skill';
    }
}
    
class Daughter extends Mother{
    
    public function run($name = ''){
        echo "daughter run skill. n";
    }
    
}
    
final class GrandChild extends Son{
        
    # 存取控制必須和父類中一樣(或者更為寬鬆)
    public function sport(){
        echo "GrandChild sport skill. n";
    }
    
    # Cannot override final method Son::notTeach()
    // public function notTeach(){} // error
}
    
#  Class Orphan may not inherit from final class (GrandChild)
// class Orphan extends GrandChild{}  // error
    
$son = new Son();
$son->speak("Suly");
    
$daughter = new Daughter();
$daughter->run('Lily');
    
$grandChild = new GrandChild();
$grandChild->sport();

抽象類別和介面的區別

1、對介面的使用是通過關鍵字implements。對抽象類別的使用是通過關鍵字extends。當然介面也可以通過關鍵字extends繼承。
2、介面中不可以聲明成員變數(包括類靜態變數),但是可以聲明類常量。抽象類別中可以聲明各種類型成員變數,實現資料的封裝。(另JAVA介面中的成員變數都要聲明為public static final類型)
3、介面沒有建構函式,抽象類別可以有建構函式。

  4、介面中的方法預設都是public類型的,而抽象類別中的方法可以使用private,protected,public來修飾。
5、一個類可以同時實現多個介面,但一個類只能繼承於一個抽象類別。

  抽象類別還是介面。
如果要建立一個模型,這個模型將由一些緊密相關的對象採用,就可以使用抽象類別。如果要建立將由一些不相關對象採用的功能,就使用介面。
如果必須從多個來源繼承行為,就使用介面。
如果知道所有類都會共用一個公用的行為實現,就使用抽象類別,並在其中實現該行為。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.