您好,登錄后才能下訂單哦!
這篇文章給大家介紹PHP類中訪問控制的Tips有哪些,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
包括PHP在內的大部分面向對象的編程語言,都提供了對類的變量或方法的訪問控制。這是實現面向對象封裝能力的基礎。變量其實就是數據,而方法函數就是處理這些數據的操作,根據最少知識原則,一些數據你不需要知道它的存在。這時,就需要使用private私有的變量和方法,私有的變量或方法只有這個類自己可以訪問。而有些變量和方法自己的子類需要使用,但又不能暴露給外部,那么我們就會使用protected,也就是受保護的。最后就是公開不管類內部、外部還是繼承的子類都可以使用的public公共變量或方法了。
我們通過變量的訪問控制先來復習一下這三種訪問控制符的作用。
class A {
private $private;
protected $protected;
public $public;
public function setPrivate($p){
$this->private = $p;
}
public function setProtected($p){
$this->protected = $p;
}
public function setPublic($p){
$this->public = $p;
}
public function testA(){
echo $this->private, '===', $this->protected, '===', $this->public, PHP_EOL;
}
}
class B extends A{
public function testB(){
echo $this->private, '===';
echo $this->protected, '===', $this->public, PHP_EOL;
}
}
$a = new A();
// $a->private = 'a-private'; // atal error: Uncaught Error: Cannot access private property A::$private
$a->setPrivate('a-private');
// $a->protected = 'a-protected'; // atal error: Uncaught Error: Cannot access protected property A::$protected
$a->setProtected('a-protected');
$a->public = 'c-public';
$a->testA();
echo "Out side public:" . $a->public, PHP_EOL;
// echo "Out side private:" . $a->private, PHP_EOL; // Fatal error: Uncaught Error: Cannot access private property A::$private
// echo "Out side protected:" . $a->protected, PHP_EOL; // Fatal error: Uncaught Error: Cannot access protected property A::$protected
$b = new B();
$b->setProtected('b-protected');
$b->public = 'b-public';
$b->testB(); // 沒有b-private
$b->setPrivate('b-private');
$b->testB(); // 沒有b-private
從上述代碼中很清晰的可以看出,除了public之外的變量都不能在類外部直接調用或者賦值。所以我們使用setXXX()的public方法來為$private和$protected賦值。這里就出現了封裝的概念了,比如在setPrivate()中我們就可以對傳遞過來的$p變量進行邏輯判斷而決定是否將值賦給$private。
B類繼承了A類,所以它可以訪問到A類的$public和$protected變量,但是,請注意,$private變量是無法訪問到的。所以即使調用了setPrivate()方法為$private賦值了,但因為B無法訪問,所以依然取不到$private的值。有小伙伴要問了,這種情況不報錯?當然不會報錯,B類會在自己的范圍內查找$private變量,沒有定義的話就會生成一個局部的變量并賦值為空。
那么子類要使用$private應該怎么辦呢?
class C extends A {
private $private;
public function testC(){
echo $this->private, '===', $this->protected, '===', $this->public, PHP_EOL;
}
// public function setPrivate($p){
// $this->private = $p;
// }
}
$c = new C();
$c->setProtected('c-protected');
$c->public = 'c-public';
$c->setPrivate('c-private');
$c->testC();
先不要打開C類setPrivate()方法的注釋,你會發現$private依然是空值。也就是說,定義了同名的$private私有變量并不是對父類的變量覆蓋,而是在本類作用域內新建了一個。父類的setPrivate()方法當然也不能訪問子類的private變量,因此,子類也要重寫一個setPrivate()方法來為自己的$private變量賦值。
記住一點:private修飾的變量或方法僅對當前類開放
對于方法的修飾也是一樣的效果。
class D {
public function testD(){
$this->show();
}
private function show(){
echo 'This is D', PHP_EOL;
}
}
class E extends D {
private function show(){
echo 'This is E', PHP_EOL;
}
}
$e = new E();
$e->testD(); // This is D
子類E調用父類D的testD()方法,testD()方法中調用的是private修飾的show()方法,根據上面的原則,它依然調用的是自己D類的show()方法。
關于訪問控制的內容還是比較簡單的,最主要的就是private這個修飾符的問題需要注意,其他的其實還是比較好理解的。不過越是簡單的東西越是基礎,面向對象脫離不了這三個簡單的訪問修飾符,它們在現代軟件開發中的份量十足,只有牢牢掌握它們才是我們正確的學習之道。
關于PHP類中訪問控制的Tips有哪些就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。