PHP中的public、private、protected是面向?qū)ο缶幊讨谐R姷脑L問控制修飾符,主要用于控制父類中的屬性和方法對(duì)子類和外部的可見性。其中,protect屬性是一種介于public和private之間的訪問修飾符,它可以在父類中被訪問,同時(shí)也可以被子類繼承,但是不可以從外部訪問的屬性和方法。
舉個(gè)例子,假設(shè)我們有一個(gè)名為Human的類,其中有一個(gè)$firstName屬性和一個(gè)sayHello()方法,我們可以將$firstName屬性設(shè)為protected,表示這個(gè)屬性只可以在Human類和它的子類中被訪問,而不能從外部訪問。
class Human { protected $firstName; function __construct($name) { $this->firstName = $name; } protected function sayHello() { echo "Hello, my name is {$this->firstName}."; } }
現(xiàn)在,我們創(chuàng)建一個(gè)名為Student的子類,它繼承了Human類,因?yàn)?firstName屬性是protected的,所以可以在Student類的構(gòu)造函數(shù)中訪問此屬性:
class Student extends Human { protected $grade; function __construct($name, $grade) { parent::__construct($name); $this->grade = $grade; } function sayHello() { parent::sayHello(); echo "I am a student in grade {$this->grade}."; } }
在上述代碼中,$grade屬性也是protected的,適用于和$firstName一樣的訪問規(guī)則。同時(shí),子類Student重寫了sayHello()方法,通過(guò)調(diào)用父類中的sayHello()方法,在輸出自我介紹的同時(shí)還添加了自己的年級(jí)信息。
如果我們像下面這樣試圖從外部訪問$firstName屬性,就會(huì)拋出錯(cuò)誤:
$s = new Student('Tom', 3); echo $s->firstName; // 拋出錯(cuò)誤
同樣的,如果我們?cè)噲D訪問子類中的$grade屬性,也會(huì)失敗:
echo $s->grade; // 拋出錯(cuò)誤
可以看到,通過(guò)使用protected屬性,我們可以有效地控制屬性和方法的可見性,從而維護(hù)程序的穩(wěn)定性和安全性。