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