在php中接口抽象類、Final、Static幾個我們用到的相當的簡單特別是大型網站架構時都會有用到了,今天我們來看一篇關于php中抽象類、Final、Static的例子。
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
- } //Vevb.com
- # 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、一個類可以同時實現多個接口,但一個類只能繼承于一個抽象類。
抽象類還是接口。
如果要創建一個模型,這個模型將由一些緊密相關的對象采用,就可以使用抽象類。如果要創建將由一些不相關對象采用的功能,就使用接口。
如果必須從多個來源繼承行為,就使用接口。
如果知道所有類都會共享一個公共的行為實現,就使用抽象類,并在其中實現該行為。
新聞熱點
疑難解答