PHP final 方法是指一個類中的方法被定義為最終方法,意味著這個方法不能被子類重寫或覆蓋。如果一個類中的某個方法已經(jīng)被定義為 final,則無論其它類是否繼承該類,都不能再對這個方法進行重寫了。
下面我們來看一個例子:
class Animal {
final public function eat() {
echo "Animal eats food.";
}
}
class Cat extends Animal {
public function eat() {
echo "Cat eats food.";
}
}
在上面的例子中,Animal 類中的 eat() 方法被定義為 final,這個方法不能被 Cat 類重寫或覆蓋。當我們運行下面的代碼時,程序?qū)?zhí)行 Animal 類中的 eat() 方法:
$animal = new Animal;
$animal->eat(); // Animal eats food.
$cat = new Cat;
$cat->eat(); // Fatal error: Cannot override final method Animal::eat()
使用 final 關(guān)鍵字的時候需要注意以下幾點:
- final 關(guān)鍵字只能用于方法和類,不能用于變量或?qū)傩浴?/li>
- 被定義為 final 的方法不能被重寫或覆蓋,但是其它方法可以調(diào)用。
- 被定義為 final 的類不能被繼承,但是可以被實例化。
下面我們看另一個例子:
final class Singleton {
private static $instance = null;
final public static function getInstance() {
if(self::$instance == null) {
self::$instance = new Singleton();
}
return self::$instance;
}
final private function __construct() {
// 私有構(gòu)造函數(shù)禁止外界實例化
}
final private function __clone() {
// 私有克隆函數(shù)禁止外界克隆實例
}
}
在上面的例子中,Singleton 類中的 getInstance() 方法被定義為 final 和 static,這使得 Singleton 類能夠滿足「單例模式」的設(shè)計要求,即保證一個類只能有一個實例。
在 getInstance() 方法中,使用了 self 關(guān)鍵字來引用該類自己。該方法通過靜態(tài)變量實現(xiàn)了對實例的創(chuàng)建,在實例為空時創(chuàng)建一個 Singleton 實例,否則直接返回該實例。
在 Singleton 類中,除了 getInstance() 方法被定義為 final 和 static,構(gòu)造函數(shù) __construct() 和 clone() 也被定義為 final 和 private,禁止外部調(diào)用該構(gòu)造函數(shù)和克隆函數(shù)實例化 Singleton 類。
使用 final 方法可以避免方法被子類重寫或覆蓋,而 final 類可以保證類只有一個實例。在編寫類時,需要根據(jù)實際情況選擇是否使用 final 關(guān)鍵字。