簡體   English   中英

為什么不能訪問類的屬性,但是可以訪問相同類的方法呢?

[英]Why is it not okay to access a property of a class, but it is okay to access a method of the same class?

我是PHP的新手,每當我閱讀良好的操作規范(尤其是與OOP相關的規范)時,我經常會看到諸如“不要將局部變量暴露給全局空間,而使用getter方法或檢索方法”這樣的語句。 。

我知道為什么我們不想污染全局名稱空間,但是在什么時候調用getter方法只是為了訪問一個簡單的屬性就變得很荒謬? 我認為這顯示出極大的虛偽。 我們願意在類定義之外公開和調用方法,但不是簡單變量? 為什么是這樣? 方法不是更復雜嗎?

如果我的困惑錯位了,請原諒我。 我對了解OOP最佳實踐非常感興趣。

始終最佳做法是使用getter和setter訪問對象屬性,因為它們會隱藏有關您如何存儲和獲取特定值的信息。

基本上,您提供了一個接口 (不會更改)來通過隱藏邏輯 (可能會更改)訪問信息。

一個愚蠢的例子可能是返回計算值的getTotal方法。 您可能會像這樣簡單的getter,它僅返回先前計算的總數:

function getTotal()
{
    return $privateTotal;
}

或者,您可以在您的吸氣劑中計算總數:

function getTotal()
{
    return $sub1 + $sub2 + $sub3;
}

您可以隨時更改實施。 客戶將不會意識到您的邏輯更改。

暫時忽略全局命名空間,並了解封裝信息隱藏的基本概念。 在OOP中,您可以使用較小的組件(例如,類)來構建軟件。 當您將類(脆弱的)內部暴露於外部時,您不能確保類正常運行。 使用Getter和Setter可以控制對要公開給類外部的變量的訪問。

問題不是為什么不應該編寫無用的getter / setter方法,而是為什么要讓變量暴露類和方法的主要用途

考慮變量只能具有getter,僅具有setter或都不具有。

這稱為封裝。 局部變量通常是實現細節。 這不應該被暴露,因為調用代碼(如果它是正確的去耦)只在乎你做什么 ,你不能怎么做。

如果您的實現發生了變化,則可能會刪除或更改變量,這意味着需要更改調用代碼。 方法對此進行了抽象,並允許內部結構進行更改而不會影響所公開的接口。

另一個原因是對變量的直接訪問允許調用代碼更改類所依賴的變量。 方法允許創建一個數組的副本,以使更改數組的代碼不會影響類的邏輯。

使用方法時,這允許類覆蓋該方法。 在某些類中,該屬性可以實現為私有變量,而在其他類中,則可以實現為更復雜的計算。 如果直接公開該屬性,那么您將在實現相同接口的所有類中都使用它(嗯,不是真的,因為您可以使用魔術方法偽造它,但是通常只能將其用作最后的手段)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM