可能我們日常工作中很少用到這塊知識點,但我還是喜歡把遇到的卻不清楚的知識點摸清
PHP的類方法重寫規則
1、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無重載機制 所以判斷是不是重寫只會通過方法名(C/C++不僅要方法名相同,參數也相同時才被視為重寫,否則即為重載,即新定義了一個多態函數的態)
class Father{ public function index($args_1) { }}class Child extends Father{ public function index($args_1, $args_2) { //在C/C++中此為重載非重寫,因為C/C++具有標準的多態機制,會因參數不同而視為某一方法的另一種態 //but在php中此依然為重寫 } 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皆可 }}