您好,登錄后才能下訂單哦!
這篇文章給大家介紹PHP類中訪問控制的Tips有哪些,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
包括PHP在內(nèi)的大部分面向?qū)ο蟮木幊陶Z言,都提供了對類的變量或方法的訪問控制。這是實(shí)現(xiàn)面向?qū)ο蠓庋b能力的基礎(chǔ)。變量其實(shí)就是數(shù)據(jù),而方法函數(shù)就是處理這些數(shù)據(jù)的操作,根據(jù)最少知識原則,一些數(shù)據(jù)你不需要知道它的存在。這時,就需要使用private私有的變量和方法,私有的變量或方法只有這個類自己可以訪問。而有些變量和方法自己的子類需要使用,但又不能暴露給外部,那么我們就會使用protected,也就是受保護(hù)的。最后就是公開不管類內(nèi)部、外部還是繼承的子類都可以使用的public公共變量或方法了。
我們通過變量的訪問控制先來復(fù)習(xí)一下這三種訪問控制符的作用。
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之外的變量都不能在類外部直接調(diào)用或者賦值。所以我們使用setXXX()的public方法來為$private和$protected賦值。這里就出現(xiàn)了封裝的概念了,比如在setPrivate()中我們就可以對傳遞過來的$p變量進(jìn)行邏輯判斷而決定是否將值賦給$private。
B類繼承了A類,所以它可以訪問到A類的$public和$protected變量,但是,請注意,$private變量是無法訪問到的。所以即使調(diào)用了setPrivate()方法為$private賦值了,但因?yàn)锽無法訪問,所以依然取不到$private的值。有小伙伴要問了,這種情況不報(bào)錯?當(dāng)然不會報(bào)錯,B類會在自己的范圍內(nèi)查找$private變量,沒有定義的話就會生成一個局部的變量并賦值為空。
那么子類要使用$private應(yīng)該怎么辦呢?
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()方法的注釋,你會發(fā)現(xiàn)$private依然是空值。也就是說,定義了同名的$private私有變量并不是對父類的變量覆蓋,而是在本類作用域內(nèi)新建了一個。父類的setPrivate()方法當(dāng)然也不能訪問子類的private變量,因此,子類也要重寫一個setPrivate()方法來為自己的$private變量賦值。
記住一點(diǎn):private修飾的變量或方法僅對當(dāng)前類開放
對于方法的修飾也是一樣的效果。
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調(diào)用父類D的testD()方法,testD()方法中調(diào)用的是private修飾的show()方法,根據(jù)上面的原則,它依然調(diào)用的是自己D類的show()方法。
關(guān)于訪問控制的內(nèi)容還是比較簡單的,最主要的就是private這個修飾符的問題需要注意,其他的其實(shí)還是比較好理解的。不過越是簡單的東西越是基礎(chǔ),面向?qū)ο竺撾x不了這三個簡單的訪問修飾符,它們在現(xiàn)代軟件開發(fā)中的份量十足,只有牢牢掌握它們才是我們正確的學(xué)習(xí)之道。
關(guān)于PHP類中訪問控制的Tips有哪些就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。