PHP類中訪問控制的一些Tips包括PHP在內(nèi)的大部分面向?qū)ο蟮木幊陶Z(yǔ)言,都提供了對(duì)類的變量或方法的訪問控制。這是實(shí)現(xiàn)面向?qū)ο蠓庋b能力的基礎(chǔ)。變量其實(shí)就是數(shù)據(jù),而方法函數(shù)就是處理這些數(shù)據(jù)的操作,根據(jù)最少知識(shí)原則,一些數(shù)據(jù)你不需要知道它的存在。這時(shí),就需要使用private私有的變量和方法,私有的變量或方法只有這個(gè)類自己可以訪問。而有些變量和方法自己的子類需要使用,但又不能暴露給外部,那么我們就會(huì)使用protected,也就是受保護(hù)的。最后就是公開不管類內(nèi)部、外部還是繼承的子類都可以使用的public公共變量或方法了。 我們通過變量的訪問控制先來(lái)復(fù)習(xí)一下這三種訪問控制符的作用。 class A { 從上述代碼中很清晰的可以看出,除了public之外的變量都不能在類外部直接調(diào)用或者賦值。所以我們使用setXXX()的public方法來(lái)為$private和$protected賦值。這里就出現(xiàn)了封裝的概念了,比如在setPrivate()中我們就可以對(duì)傳遞過來(lái)的$p變量進(jìn)行邏輯判斷而決定是否將值賦給$private。 B類繼承了A類,所以它可以訪問到A類的$public和$protected變量,但是,請(qǐng)注意,$private變量是無(wú)法訪問到的。所以即使調(diào)用了setPrivate()方法為$private賦值了,但因?yàn)锽無(wú)法訪問,所以依然取不到$private的值。有小伙伴要問了,這種情況不報(bào)錯(cuò)?當(dāng)然不會(huì)報(bào)錯(cuò),B類會(huì)在自己的范圍內(nèi)查找$private變量,沒有定義的話就會(huì)生成一個(gè)局部的變量并賦值為空。 那么子類要使用$private應(yīng)該怎么辦呢? class C extends A { 先不要打開C類setPrivate()方法的注釋,你會(huì)發(fā)現(xiàn)$private依然是空值。也就是說,定義了同名的$private私有變量并不是對(duì)父類的變量覆蓋,而是在本類作用域內(nèi)新建了一個(gè)。父類的setPrivate()方法當(dāng)然也不能訪問子類的private變量,因此,子類也要重寫一個(gè)setPrivate()方法來(lái)為自己的$private變量賦值。 記住一點(diǎn):private修飾的變量或方法僅對(duì)當(dāng)前類開放 對(duì)于方法的修飾也是一樣的效果。 class D { 子類E調(diào)用父類D的testD()方法,testD()方法中調(diào)用的是private修飾的show()方法,根據(jù)上面的原則,它依然調(diào)用的是自己D類的show()方法。 總結(jié)關(guān)于訪問控制的內(nèi)容還是比較簡(jiǎn)單的,最主要的就是private這個(gè)修飾符的問題需要注意,其他的其實(shí)還是比較好理解的。不過越是簡(jiǎn)單的東西越是基礎(chǔ),面向?qū)ο竺撾x不了這三個(gè)簡(jiǎn)單的訪問修飾符,它們?cè)诂F(xiàn)代軟件開發(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)理 > 《待分類》