php中接口、抽象類以及接口和抽象類區別詳解

  1. 接口
    (1)對接口的使用是通過關鍵字implements
    (2)接口不能定義成員變量(包括類靜態變量),能定義常量
    (3)子類必須實現接口定義的所有方法
    (4)接口只能定義不能實現該方法
    (5)接口沒有構造函數
    (6)接口中的方法和實現它的類默認都是public類型的

    # 接口
    
    interface Human{
    
        const TEST_CONST = "test const"; // 定義常量
    
        // public $v; // error,不能定義變量
    
        // static $count; // error,不能定義變量
    
        public function speak();
    
        public function walk();
    
        public function run();
    
    }
    
  2. 抽象類
    (1)對抽象類的使用是通過關鍵字extends
    (2)不能被實例化,可以定義子類必須實現的方法
    (3)子類必須定義父類中的所有抽象方法,這些方法的訪問控制必須和父類中一樣(或者更爲寬鬆)
    (4)如一個類中有一個抽象方法,則該類必須定義爲抽象類
    (5)抽象類可以有構造函數
    (6)抽象類中的方法可以使用private,protected,public來修飾。
    (7)一個類可以同時實現多個接口,但一個類只能繼承於一個抽象類。

    # 抽象類
    
    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";
    
        }
    
          
    
    }
    
  3. Final類/方法
    (1)final類不能被繼承
    (2)final方法不能被重寫

    final class GrandChild extends Son{
    
              
    
        # 訪問控制必須和父類中一樣(或者更爲寬鬆)
    
        public function sport(){
    
            echo "GrandChild sport skill. n";
    
        }
    
          
    
        # Cannot override final method Son::notTeach()
    
        // public function notTeach(){} // error
    
    }
    
  4. Static類/方法
    (1)可以不實例化類而直接訪問
    (2)靜態屬性不可以由對象通過->操作符來訪問,用::方式調用

抽象類和接口的區別

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

4、接口中的方法默認都是public類型的,而抽象類中的方法可以使用private,protected,public來修飾。

5、一個類可以同時實現多個接口,但一個類只能繼承於一個抽象類。

原文地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章