可以使用abstract來修飾一個類別或方法。
用abstract修飾的類別表示這個類別是一個抽象類別,用abstract修飾的方法表示這個方法是一個抽象方法。
抽象類別不能被實例化。
抽象方法是只有方法聲明,而沒有方法的實作內容。
abstract 抽象類別
可以使用abstract來修飾一個類別。
用abstract修飾的類別表示這個類別是抽象類別。
抽象類別不能被實例化。
這是一個簡單抽象的方法,如果它被直接實例化,系統會報錯。
Php代碼
<?php //定义一个抽象类 abstract class User { public function __toString() { return get_class($this); } } //实例化这个类会出现错误 echo new User(); ?>
下面例子的 NormalUser 繼承自 User類,就可以被實例化了。
Php代碼
<?php //定义一个抽象类 abstract class User { public function __toString() { return get_class($this); } } //实例化这个类会出现错误 echo new User(); class NormalUser extends User { } $a = new NormalUser(); echo "这个类" . $a . "的实例"; ?>
單獨設定一個抽象類別是沒有意義的,只有有了抽象方法,抽象類別才有了血肉。下面介紹抽象方法。
abstract 抽象方法
用abstract修飾的類別表示這個方法是一個抽象方法。
抽象方法,只有方法的聲明部分,沒有方法體。
抽象方法沒有 {} ,而採用 ; 結束。
一個類別中,只要有一個抽象方法,這個類別必須被宣告為抽象類別。
抽象方法在子類別中必須被重寫。
下面是一個抽象類,其中有兩個抽象方法,分別是 setSal() 和 getSal()。用來取回 $sal 員工的薪水。
Php程式碼
<?php abstract class User { protected $sal = 0; //这里定义的抽象方法。 //注意抽象方法没有方法体,而且方法结束使用 ; 号。 abstract function getSal(); abstract function setSal(); //定义它的__tostring方法 public function __toString() { return get_class($this); } } ?>
既然User類別不能直接繼承,我們寫一個NormalUser類別繼承自User類別。當我們寫成以下程式碼時,系統會報錯。 這個錯誤告訴我們,在 User類別中有兩個抽象方法,我們必須在子類別中重寫這兩個方法。 📜注意看重寫方法的參數名稱,這裡只要參數數量一致就可以,不要求參數的名稱必須一致。
Php代碼
<?php abstract class User { protected $sal = 0; //这里定义的抽象方法。 //注意抽象方法没有方法体,而且方法结束使用 ; 号。 abstract function getSal(); abstract function setSal(); //定义它的__tostring方法 public function __toString() { return get_class($this); } } class NormalUser extends User { } ?>
下面19-21行,三種寫重寫的方式都會報錯。
19行,缺參數。
<?php abstract class User { protected $sal = 0; //这里定义的抽象方法。 //注意抽象方法没有方法体,而且方法结束使用;号。 abstract function getSal(); abstract function setSal(); //定义它的__tostring方法 public function __toString() { return get_class($this); } } class NormalUser extends User { function getSal() { } function setSal($sal) { } } //这样就不会出错了。 ?>抽象類別繼承抽象類別抽象類別繼承另外一個抽象類別時,不用重寫其中的抽象方法。 抽象類別中,不能重寫抽象父類別的抽象方法。 這樣的用法,可以理解為對抽象類別的擴充下面的例子,示範了一個抽象類別繼承自另外一個抽象類別時,不需要重寫其中的抽象方法。 Php代碼
<?php class User { protected $sal = 0; //这里定义的抽象方法。 //注意抽象方法没有方法体,而且方法结束使用;号。 abstract function getSal(); abstract function setSal(); //定义它的__tostring方法 public function __toString() { return get_class($this); } } //这个类中有两个抽象方法,如果这个类不是抽象的。会报错 ?>
抽象類別在繼承後,其中的抽象方法不能重寫。
如果發生重寫,系統會報錯。
Php程式碼
<?php abstract class User { protected $sal = 0; abstract function getSal(); abstract function setSal($sal); } abstract class VipUser extends User { } ?>
抽象類別繼承抽象類別,目的對抽象類別的擴展。
Php程式碼
<?php abstract class User { protected $sal = 0; abstract function getSal(); abstract function setSal($sal); } abstract class VipUser extends User { abstract function setSal(); } ?>
在PHP5.1中,在抽象類別中支援靜態抽象方法。下面這個例子,看到靜態抽象方法可以宣告。實作這個方法時,必須是靜態的方法。
靜態抽象方法
在PHP5.1中,在抽象類別中支援靜態抽象方法。下面這個例子,看到靜態抽象方法可以宣告。實作這個方法時,必須是靜態的方法。
Php代碼
<?php abstract class User { protected $sal = 0; abstract function getSal(); abstract function setSal($sal); } abstract class VipUser extends User { protected $commision = 0; abstract function getCommision(); abstract function setCommision(); } ?>