可能我們日常工作中很少用到這塊知識點,但我還是喜歡把遇到的卻不清楚的知識點摸清
php的類方法重寫規則
1、final修飾的類方法不可被子類重寫
final修飾的類方法不可被子類重寫 即便final private方法無法被繼承 子類仍不能對齊進行重寫
class finalmethod
//可繼承不可重寫
final public function finalpublic()
echo "can be inherited, but be overrided";
//可繼承不可重寫
final protected function finalprotected()
echo "can be inherited, but be overrided";
//不可繼承不可重寫 雖然子類繼承不到父類的private方法 但同時也會被final限制無法重寫
final private function finalprivate()
echo "can not be inherited or be overrided";
//雖然不可繼承 但子類裡可重寫此方法
private function private()
echo "can not be inherited ,but be overrided";
class override extends finalmethod
//error
public function finalpublic()
//error
protected function finalprotected()
//error
private function finalprivate()
//correct
public/protected/private function private()
//子類繼承父類重寫父類方法時訪問級別只能更加寬鬆 不可更為嚴格
2、php是否重寫父類方法只會根據方法名是否一致判斷(5.3以後重寫父類方法引數個數必須一致)
這裡並不是說方法引數無任何作用 php無過載機制 所以判斷是不是重寫只會通過方法名(c/c++不僅要方法名相同,引數也相同時才被視為重寫,否則即為過載,即新定義了乙個多態函式的態) 當方法名相同時即被認為是在重寫父類方法,5.2可以引數不同,5.3以後引數需和父類方法一致,且都追尋繼承訪問級別的規則。
class father
public function index($args_1)
class child extends father
以後重寫方法必須與父類保持引數個數相同
public function index($args_1, $args_2)
//在c/c++中此為過載非重寫,因為c/c++具有標準的多型機制,會因引數不同而視為某一方法的另一種態
//but在php中此依然為重寫 但5.3以後此為非法 必須與父類的方法引數個數保持一致
以後重寫方法必須與父類保持引數個數相同
private function index($args_1, $args_2)
//c/c++會因為引數不同於父類方法而視為過載,即新定義了乙個函式的態,所以不會受到繼承訪問許可權的限制
//但php仍然會被視為對父類方法的重寫,會受到繼承訪問許可權的公升降規則限制
3、重寫時訪問級別只可以等於或者寬鬆於父類 不可提公升訪問級別
父類的public方法不能被子類重寫為protected或者private,protected方法不能被重寫為private,可以寬鬆er,不可以嚴格er
class father
public function index()
class child extends father
protected/private function index()
//訪問許可權提公升 錯誤
//父類為public 則子類重寫也只能為public
//父類為protected 則子類可為public/protected
//父類為private 則子類public/protected/private皆可
其實關於訪問級別繼承規則有很多有趣的地方
private在我們常識中是無法被繼承的,子類拿不到,但其訪問級別已是最高,所以你在子類中可以寫成private protected public 彷彿是我們自己重新定義了乙個函式一樣,這點在5.2版本之前尤其突出,因為5.2之前的版本在繼承重寫父類方法是可以不保持引數個數相同,但5.3以後加強了這方面的限制,引數個數必須與父類相同
注:子類實現父類的抽象方法或某類實現介面的方法時其實仍屬於繼承關係,仍追尋訪問等級只能降低不可提公升的規則
而且抽象方法不可被宣告為private,abstract修飾的方法肯定是用於繼承實現的,所以只能是public或者protected
介面的方法宣告必須為public,inte***ce裡宣告的方法也肯定是被繼承實現的,且只能是public, implements 此介面的類也指定重寫成public型別的方法
php方法過載方法重寫 php中重寫方法有什麼規則
php中重寫方法的規則有 1 final修飾的類方法不能被子類重寫 2 如果要重寫父類方法,那麼引數個數必須一致 3 在重寫時,訪問級別只可以等於或大於父類,不可提公升訪問級別。方法重寫規則 1 final修飾的類方法不可被子類重寫 final修飾的類方法不可被子類重寫 即便final privat...
php過載和重寫 PHP過載
整理思路時想到乙個問題 php為什麼不允許同名函式存在?即不允許常見於其他語言的過載機制?過載和重寫 先區分一下過載 overload 和重寫 override 過載指多個名字相同,但引數不同的函式在同一作用域並存的現象 重寫出現在繼承中,指子類重定義父類功能的現象,也被稱為覆蓋。過載中說的引數不同...
方法過載,方法重寫
方法過載 前提 必須在同一類中!才能過載 特點 這幾個方法要在乙個類中 這幾個方法名字要一樣 這幾個方法引數項不同 引數型別不同 主要就是 引數列表不能相同 順序可以不同 方法的重寫 前提是繼承關係 訪問修飾符要比繼承之前的大,返回值型別相同,方法名相同,引數列表相同,但方法體不同,稱為方法的重寫 ...