PHP是一種流行的腳本語言,它支持多種訪問控制修飾符,包括public、protected和private。本文將重點講解PHP中的protected修飾符及其覆蓋方法。因為protected是一種限制訪問的訪問修飾符,也就是說只有類及其子類的方法才能調用該成員,定義成員后,我們可以利用繼承來覆蓋它的實現方式。下面我們通過舉例來說明。
在上面的例子中,我們創建了一個Ancestor類,它具有一個protected屬性$property和一個公共方法getProperty。然后,我們分別創建了兩個子類Descendant1和Descendant2,它們都繼承了Ancestor的屬性和方法。但是,它們分別覆蓋了getProperty的實現方式,我們可以看到它們都調用了父類的getProperty方法,只不過輸出內容的前綴不同:Descendant1輸出“I am Descendant1”,而Descendant2輸出“I am Descendant2”。
這個例子很好地說明了protected屬性和方法的覆蓋方法,也就是在子類中重新定義成員時,必須使用相同的訪問控制修飾符。如果重新定義的成員沒有指定修飾符,則默認使用子類中定義的修飾符。
在實際的應用中,我們經常需要使用protected屬性和方法來保護類的內部實現細節,而又需要讓子類能夠訪問和修改這些屬性和方法。在這種情況下,覆蓋protected屬性和方法就成為了一種非常有用的技巧。
上面的例子展示了protected屬性在子類中的覆蓋應用。我們在Person類中定義了兩個protected屬性$name和$age,并提供了一些公共方法來訪問和修改這些屬性。然后,我們創建了一個Student類,它繼承了Person的屬性和方法,并定義了一個private屬性$score來存儲學生成績。在構造方法中,我們調用了父類的構造方法來初始化$name和$age屬性。然后,我們通過子類中的公共方法來訪問$name和$age屬性,并通過子類中的私有方法來訪問$score屬性。最后,我們定義了一個showInfo方法,它調用了父類中的getName和getAge方法,并輸出了學生的姓名、年齡和成績。
這個例子展示了protected屬性的另一個用途,即在子類中修改父類屬性的值。我們可以通過子類中的公共方法來設置父類屬性的值,例如setName和setAge方法,然后通過子類中的公共方法來獲取這些值,例如getName和getAge方法。在showInfo方法中,我們可以通過父類中的getName和getAge方法來獲取$name和$age屬性的值,并通過$this->score來獲取$score屬性的值,最后輸出學生的信息。
在PHP中,protected屬性和方法提供了一種訪問限制的機制,可以保護類的內部實現細節,同時允許子類擴展和修改這些屬性和方法。通過覆蓋protected屬性和方法,我們可以在子類中重新定義這些屬性和方法的實現方式,并利用繼承實現代碼的復用和擴展。
class Ancestor { protected $property = 'Hello World'; <br> public function getProperty(){ echo $this->property . "\n"; } } <br> class Descendant1 extends Ancestor{ public function getProperty(){ echo "I am Descendant1\n"; echo $this->property . "\n"; } } <br> class Descendant2 extends Ancestor{ public function getProperty(){ echo "I am Descendant2\n"; Ancestor::getProperty(); } } <br> $ancestor = new Ancestor(); $descendant1 = new Descendant1(); $descendant2 = new Descendant2(); <br> $ancestor->getProperty(); // 輸出:Hello World $descendant1->getProperty(); // 輸出:I am Descendant1 和 Hello World $descendant2->getProperty(); // 輸出:I am Descendant2 和 Hello World
在上面的例子中,我們創建了一個Ancestor類,它具有一個protected屬性$property和一個公共方法getProperty。然后,我們分別創建了兩個子類Descendant1和Descendant2,它們都繼承了Ancestor的屬性和方法。但是,它們分別覆蓋了getProperty的實現方式,我們可以看到它們都調用了父類的getProperty方法,只不過輸出內容的前綴不同:Descendant1輸出“I am Descendant1”,而Descendant2輸出“I am Descendant2”。
這個例子很好地說明了protected屬性和方法的覆蓋方法,也就是在子類中重新定義成員時,必須使用相同的訪問控制修飾符。如果重新定義的成員沒有指定修飾符,則默認使用子類中定義的修飾符。
在實際的應用中,我們經常需要使用protected屬性和方法來保護類的內部實現細節,而又需要讓子類能夠訪問和修改這些屬性和方法。在這種情況下,覆蓋protected屬性和方法就成為了一種非常有用的技巧。
class Person{ protected $name; protected $age; <br> public function __construct($name,$age){ $this->name = $name; $this->age = $age; } <br> public function getName(){ return $this->name; } <br> public function setName($name){ $this->name = $name; } <br> public function getAge(){ return $this->age; } <br> public function setAge($age){ $this->age = $age; } } <br> class Student extends Person{ private $score; <br> public function __construct($name,$age,$score){ parent::__construct($name,$age); $this->score = $score; } <br> public function getScore(){ return $this->score; } <br> public function setScore($score){ $this->score = $score; } <br> public function showInfo(){ echo "My name is " . parent::getName() . ", I'm " . parent::getAge() . " years old, and my score is " . $this->score . ".\n"; } } <br> $student = new Student("Tom", 18, 80); echo $student->getName() . "\n"; echo $student->getAge() . "\n"; echo $student->getScore() . "\n"; $student->showInfo();
上面的例子展示了protected屬性在子類中的覆蓋應用。我們在Person類中定義了兩個protected屬性$name和$age,并提供了一些公共方法來訪問和修改這些屬性。然后,我們創建了一個Student類,它繼承了Person的屬性和方法,并定義了一個private屬性$score來存儲學生成績。在構造方法中,我們調用了父類的構造方法來初始化$name和$age屬性。然后,我們通過子類中的公共方法來訪問$name和$age屬性,并通過子類中的私有方法來訪問$score屬性。最后,我們定義了一個showInfo方法,它調用了父類中的getName和getAge方法,并輸出了學生的姓名、年齡和成績。
這個例子展示了protected屬性的另一個用途,即在子類中修改父類屬性的值。我們可以通過子類中的公共方法來設置父類屬性的值,例如setName和setAge方法,然后通過子類中的公共方法來獲取這些值,例如getName和getAge方法。在showInfo方法中,我們可以通過父類中的getName和getAge方法來獲取$name和$age屬性的值,并通過$this->score來獲取$score屬性的值,最后輸出學生的信息。
在PHP中,protected屬性和方法提供了一種訪問限制的機制,可以保護類的內部實現細節,同時允許子類擴展和修改這些屬性和方法。通過覆蓋protected屬性和方法,我們可以在子類中重新定義這些屬性和方法的實現方式,并利用繼承實現代碼的復用和擴展。
上一篇php propel
下一篇css導航條布局