在PHP編程中,有時候我們希望某些屬性或方法可以在當前類或其子類中被訪問和使用,但是不希望它被類的外部訪問和濫用,這時候我們可以使用PHP的訪問修飾符去控制類中的成員的可見性。其中,protected訪問修飾符可以讓被修飾的成員在當前類和其子類中被訪問和使用,但在類的外部則無法訪問。
那么,在子類中如何對被保護的成員進行重寫呢?這里我們假設有一個基類Animal,其中有一個保護屬性$name和一個公共方法getName(),如下所示:
class Animal { protected $name = "Animal"; public function getName() { return $this->name; } }
現在我們需要定義一個子類Cat,它需要重寫Animal中的$name屬性和getName()方法。
class Cat extends Animal { // 重寫$name屬性 protected $name = "Cat"; // 重寫getName()方法 public function getName() { return "My name is " . $this->name; } }
在上面的代碼中,我們使用protected修飾Cat類中的$name屬性,以重寫Animal類中的同名屬性,從而實現了屬性重寫。同時,我們又重寫了Cat類中的getName()方法,通過調用父類的$name屬性和在子類中新增的字符串,實現了方法重寫。
值得注意的是,子類中重寫的屬性和方法的可見性(public、protected、private)要與父類中保持一致或更加嚴格,否則會報錯。例如,如果我們在Cat類中使用public修飾$name屬性,將會報錯。
class Cat extends Animal { // 錯誤!子類中的$name屬性可見性應該與父類中保持一致或更加嚴格 public $name = "Cat"; }
除了重寫父類的屬性和方法,我們還可以在子類中通過parent關鍵字調用父類中的被保護成員,如下所示:
class Cat extends Animal { // 重寫$name屬性 protected $name = "Cat"; // 重寫getName()方法 public function getName() { // 調用父類的getName()方法 $name = parent::getName(); return "My name is " . $this->name . ", and my parent's name is " . $name; } }
在上面的代碼中,我們通過parent::getName()調用了父類Animal中的getName()方法,并將其返回值賦值給變量$name。然后,我們在子類中構造了一個新字符串,包含了子類中的$name屬性和父類的$name屬性,最后將其返回。
在實際開發中,我們通常會使用繼承和重寫的方式實現代碼的復用和功能的拓展,同時通過訪問修飾符和父類調用等技術,保證代碼的安全性和可靠性。