簡體   English   中英

私有靜態方法與靜態方法

[英]Private static method vs. static method

我知道static意味着不需要為該屬性/方法實例化一個對象就可以使用。 我也了解這如何適用於私有屬性和方法以及公共方法。 我想了解的是靜態私有函數為您帶來了什么。 例如:

class Beer {
    static private $beertype = "IPA";

    private function getBeerType() {
            return self::$beertype;
    }

    static public function BeerInfo() {
            return self::getBeerType();
    }
}

print Beer::BeerInfo() . "\n";

私有方法getBeerType()在沒有實例化對象的情況下執行得很好,只要它是從靜態公共方法調用的。 如果靜態公共方法可以訪問所有私有方法(靜態和非靜態),那么將方法聲明為靜態私有有什么好處?

啟用嚴格的錯誤報告后,我確實收到警告,提示我應該getBeerType()靜態,盡管它仍然允許我運行代碼。 我做了一些研究,似乎其他語言(Java)在被靜態公共方法調用時會強制您將私有方法聲明為靜態方法。 看起來 PHP 可以讓你擺脫這個。 有沒有辦法強制它拋出錯誤而不執行

靜態私有方法提供了一種從類外部隱藏靜態代碼的方法。 如果幾種不同的方法(靜態或非靜態)需要使用它,即代碼重用,這可能很有用。

靜態方法和靜態變量,有時稱為類方法和類變量,是將代碼和數據放入某種命名空間的一種方式。 您還可以將類變量視為附加到類本身的變量,其中(根據定義)只有一個,而不是該類的實例,其中可能有零個、一個或多個。 類方法和類變量可以在與不只是在所有情況下保持相同的屬性時非常有用,但實際上相同的。

類變量的一個示例是 ORM 實體對象中的數據庫處理程序。 所有實例都是它們自己的對象,但它們都需要訪問相同的數據庫處理程序來加載和保存它們自己。

私人與公共是完全不同的品質,我懷疑這是您絆倒的東西。 不能調用私有方法,不能從類外的代碼訪問私有變量。 私有方法通常用於在對象上實現不能從對象外部訪問的“內部”邏輯。 實例方法和類方法都可能需要此限制。

私有類方法的一個例子可能是在工廠方法中。 可能存在三個用於創建對象的工廠調用,它們提供的參數可能不同。 然而,大部分操作是相同的。 所以它進入了非私有工廠方法調用的private static方法。

我理解靜態意味着不需要為該屬性/方法實例化一個對象即可使用。

一切都是靜態的。 全球。

我也明白這如何適用於公共屬性和方法以及公共方法

你確定你明白它創建了一個全局變量和一個標准的全局函數嗎?

我想了解的是靜態私有函數為您帶來了什么。

private只是可見性Docs 的一個說明符。 這樣您就可以獲得可見性控制。

有用嗎? 取決於用例。

這是為了防止其他人食用它。

例如,您有一個Logger靜態對象,然后您有兩個公共靜態方法LogOkLogError ,它們都受益於“內部”方法Log但您不希望該類的使用者能夠直接調用Log

您可以調用Logger::LogOk( "All right." ); 但你不能調用Logger::Log( "abc" ); 如果Log是私有的。

你可以在內部總是從同一個類中使用它。

盡管代碼有效,但它拋出了嚴格的標准錯誤:

嚴格標准:非靜態方法 Beer::getBeerType() 不應靜態調用

因此,在這里您可以使用private static

簡單的說,如果你在類中的一些public static函數中有重復操作,你可以聲明一個private static function

自然地,如果您是一個沒有經驗的程序員或 OOP 新手,那么對您的代碼進行限制似乎很奇怪。 但是像這樣的嚴格聲明將使您的代碼更清晰,更易於維護。 在大型項目和復雜的類中,您可以准確地知道從函數中得到什么以及如何使用它。

這是一個很好的閱讀:單一職責原則上帝對象

這是規則和最佳答案,

靜態方法不能訪問非靜態變量和方法,因為它們需要類的實例。 不要擔心警告,規則已經設置,一旦完全執行,它將在將來破壞您的代碼。 這就是為什么

static public function BeerInfo() {
            return self::getBeerType()

是錯的,

您必須將 getBeerType 聲明為靜態。

在您的示例中,您可以通過執行以下操作來簡化此操作。

static private $beertype = "IPA";

static public function BeerInfo() {
   return self::$beertype;
}

“靜態”純粹是指駐留在單個內存區域中。 如果您有記憶意識,靜態實現是一個很好的策略。

當您使用公共靜態函數時,大多數情況下,您可能不想處理該類的實例,而是想重新使用該類中預先存在的功能。 利用私有靜態函數是在沒有實例的情況下做到這一點的方法。

但是,您可以有一個公共靜態函數,它接受一個參數,該參數是所述類的實例,例如

static public function doSomething(Beer &$ref) {
   $ref->instanceLevelFunction(...);
}

暫無
暫無

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

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