PHP類(lèi)中訪問(wèn)控制的一些Tips包括PHP在內(nèi)的大部分面向?qū)ο蟮木幊陶Z(yǔ)言,都提供了對(duì)類(lèi)的變量或方法的訪問(wèn)控制。這是實(shí)現(xiàn)面向?qū)ο蠓庋b能力的基礎(chǔ)。變量其實(shí)就是數(shù)據(jù),而方法函數(shù)就是處理這些數(shù)據(jù)的操作,根據(jù)最少知識(shí)原則,一些數(shù)據(jù)你不需要知道它的存在。這時(shí),就需要使用private私有的變量和方法,私有的變量或方法只有這個(gè)類(lèi)自己可以訪問(wèn)。而有些變量和方法自己的子類(lèi)需要使用,但又不能暴露給外部,那么我們就會(huì)使用protected,也就是受保護(hù)的。最后就是公開(kāi)不管類(lèi)內(nèi)部、外部還是繼承的子類(lèi)都可以使用的public公共變量或方法了。 我們通過(guò)變量的訪問(wèn)控制先來(lái)復(fù)習(xí)一下這三種訪問(wèn)控制符的作用。 class A {從上述代碼中很清晰的可以看出,除了public之外的變量都不能在類(lèi)外部直接調(diào)用或者賦值。所以我們使用setXXX()的public方法來(lái)為$private和$protected賦值。這里就出現(xiàn)了封裝的概念了,比如在setPrivate()中我們就可以對(duì)傳遞過(guò)來(lái)的$p變量進(jìn)行邏輯判斷而決定是否將值賦給$private。 B類(lèi)繼承了A類(lèi),所以它可以訪問(wèn)到A類(lèi)的$public和$protected變量,但是,請(qǐng)注意,$private變量是無(wú)法訪問(wèn)到的。所以即使調(diào)用了setPrivate()方法為$private賦值了,但因?yàn)锽無(wú)法訪問(wèn),所以依然取不到$private的值。有小伙伴要問(wèn)了,這種情況不報(bào)錯(cuò)?當(dāng)然不會(huì)報(bào)錯(cuò),B類(lèi)會(huì)在自己的范圍內(nèi)查找$private變量,沒(méi)有定義的話就會(huì)生成一個(gè)局部的變量并賦值為空。 那么子類(lèi)要使用$private應(yīng)該怎么辦呢? class C extends A {先不要打開(kāi)C類(lèi)setPrivate()方法的注釋?zhuān)銜?huì)發(fā)現(xiàn)$private依然是空值。也就是說(shuō),定義了同名的$private私有變量并不是對(duì)父類(lèi)的變量覆蓋,而是在本類(lèi)作用域內(nèi)新建了一個(gè)。父類(lèi)的setPrivate()方法當(dāng)然也不能訪問(wèn)子類(lèi)的private變量,因此,子類(lèi)也要重寫(xiě)一個(gè)setPrivate()方法來(lái)為自己的$private變量賦值。 記住一點(diǎn):private修飾的變量或方法僅對(duì)當(dāng)前類(lèi)開(kāi)放 對(duì)于方法的修飾也是一樣的效果。 class D {子類(lèi)E調(diào)用父類(lèi)D的testD()方法,testD()方法中調(diào)用的是private修飾的show()方法,根據(jù)上面的原則,它依然調(diào)用的是自己D類(lèi)的show()方法。 總結(jié)關(guān)于訪問(wèn)控制的內(nèi)容還是比較簡(jiǎn)單的,最主要的就是private這個(gè)修飾符的問(wèn)題需要注意,其他的其實(shí)還是比較好理解的。不過(guò)越是簡(jiǎn)單的東西越是基礎(chǔ),面向?qū)ο竺撾x不了這三個(gè)簡(jiǎn)單的訪問(wèn)修飾符,它們?cè)诂F(xiàn)代軟件開(kāi)發(fā)中的份量十足,只有牢牢掌握它們才是我們正確的學(xué)習(xí)之道。 測(cè)試代碼:https://github.com/zhangyue0503/dev-blog/blob/master/php/201912/source/PHP%E7%B1%BB%E4%B8%AD%E8%AE%BF%E9%97%AE%E6%8E%A7%E5%88%B6%E7%9A%84%E4%B8%80%E4%BA%9BTips.php 參考文檔:https://www./manual/zh/language.oop5.visibility.php#87413https://www./manual/zh/language.oop5.visibility.php#110555https://www./manual/zh/language.oop5.visibility.php |
|
|
來(lái)自: 硬核項(xiàng)目經(jīng)理 > 《待分類(lèi)》