我正在專門討論可應用於屬性和方法的公共,私有和受保護關鍵字。我到處尋找,我知道他們在做什麼以及如何使用它們,但是沒有看到它們在編程時如何實用。有人可以解釋或舉例嗎?PHP:封裝的目的是什麼?
回答
封裝(範圍)的主要目的是確保您編寫不能被破壞的代碼。這適用於一般範圍,所以讓我用一個局部變量的一個簡單的例子在函數內部:
function xyz ($x) {
$y = 1;
while ($y <= 10) {
$array[] = $y * $x;
$y++;
}
return $array;
}
該功能的目的是傳遞一個號碼,返回數組。示例代碼非常基本。爲了使函數xyz()可靠,你需要保證它每次都做完全一樣的事情。那麼如果某人有能力從外部改變$ y或$ array的初始值呢?甚至$ x?如果你能夠從函數之外做到這一點,那麼你不能再保證函數返回的是什麼。
這就是範圍(封裝)發揮作用的地方。這是一種設置邊界的方法,可以爲變量(和函數,屬性,方法,對象)分配可以和不可以執行的操作的權限,以確保代碼的位數始終與預期的完全一致。
拿任何內置的PHP函數,如... strtolower()或preg_match()或...以及任何東西。他們期望將論據傳遞給他們,並且他們返回具體的東西。內部有變量,循環等等來接受輸入並吐出輸出。如果你能夠從外部改變這些東西,那麼將無法保證strotolower()會返回一個你提供它的小寫字符串,並且這會破壞具有可重用代碼塊的目的。
當你爲自己編程時,這並不一定是有用的,但是當你編寫代碼被許多人使用和共享時,特別是使用涉及插件/插件等的代碼時......它是對於確保您的代碼執行它應該做的事情非常寶貴,並且以預期的方式被訪問/使用/調用。
私有/受保護的方法用於編譯語言,如C++和Java。如果代碼編譯爲腳本形式,則這些規則是可執行的。在這些語言中,特別可以隱藏繁瑣的內部或機器級別的實現。
PHP只具有這些功能,因爲它的開發人員認爲缺乏受保護/私有方法是指當人們將PHP4推導爲不適合面向對象的語言時。
在PHP中使用封裝作爲設計概念是無可爭議的。然而,使用這些語言結構並不是必須的,並且無論如何都可以在源代碼中輕鬆地刪除。但是,代替適當的庫文檔或者如果coprogrammer不尊重編碼風格,限制訪問是有用的。
因此,總之:技術用例微薄,鼓勵使用指定的接口來抽象過程沒問題。然而,通常設計API的方式使得所有所需的功能和數據易於使用,這樣更加有意義,因此訪問無關內部的嘗試被減少了。你越暴露,越難以改變內部處理。您公開的內在數據越多,出現越少的變通方法或複雜的對象結構。
我覺得格雷迪Booch的概括起來相當不錯:
「封裝用於抽象的合同接口及其實現分離」
,你可以找到在同一個here一個很好的討論。雖然它與.net(不在PHP)中有關,但仍然是一個相當普遍的討論,其中還包括對維基百科文章的討論。
- 1. 封裝函數是什麼?
- 2. 什麼是正確的封裝語法?
- 3. 封裝的指標是什麼?
- 4. Python頭文件 - $(美元符號)封裝的目的是什麼?
- 5. 爲OOP描述公共封裝的目的是什麼?
- 6. 在PHP中封裝和不封裝HTML有什麼區別?
- 7. 什麼是封
- 8. 什麼是@的目的PHP
- 9. 什麼等同於封裝封裝內部功能的封裝專用接口?
- 10. 在C#中,在這個類中封裝方法的目的是什麼?
- 11. Javascript - 在函數中封裝函數或代碼的目的是什麼?
- 12. 爲什麼封裝不在對象中/爲什麼我們稱之爲封裝
- 13. 在Bourne Shell腳本(.sh)中封裝PHP cron作業的好處是什麼?
- 14. 沒有類的PHP封裝?
- 15. 安裝cordova的目錄是什麼?
- 16. 封裝多步計算最優雅的方式是什麼?
- 17. 封裝這種功能的正確方法是什麼?
- 18. 如果未指定,封裝爲java類的屬性是什麼?
- 19. 什麼是封裝,它如何捍衛對腐敗的抽象?
- 20. 什麼是暴露封裝類方法的經驗法則
- 21. ssis中不同封裝配置的優缺點是什麼
- 22. 什麼是封裝ADO.Net查詢的最佳c#方法
- 23. C++庫的C封裝 - 繼承是什麼?
- 24. 封裝PHP會話
- 25. Android JNI是否可以封裝封裝?
- 26. 帶有封裝項目的Android項目
- 27. php umask(0)這是什麼目的
- 28. XNA是DirectX的封裝嗎?
- 29. 爲什麼StringBuilder類是密封的?
- 30. 爲什麼C#SerializedAttribute是密封的?