簡體   English   中英

使我的auth系統成為單例類的利弊

[英]pros and cons of making my auth system a singleton class

我在應用程序的OOP設計方面面臨兩難選擇。 我是否應該將auth類設為單例。 我看到kohana框架和zend框架將其auth類用作單例。 使身份驗證類成為單例的缺點是什么? 有什么優點? 另外,我正在構建的應用程序將是企業應用程序,並且需要擴展,因此如果是單例,我的身份驗證系統也可以擴展嗎?

這里有一些缺點:

  • 很難測試,因為代碼與類名綁定在一起
  • 引入全球狀態
  • 無法確定影響的原因-不相關的方法可以互相影響
  • 整個代碼庫中的身份驗證請求分散
  • 違反LoD

通過檢查用戶的身份,驗證的階段以及驗證的准確性,您可能會受益匪淺(不要與授權混淆)。 另外,您可能對此主題感興趣。

更新

以下是您可能感興趣的一些視頻:

避免使用單例,僅在硬件對每個應用程序限制一個對象->資源的情況下使用單例。 如果合並了singleton,則將無法與系統中的其他交換auth類,您將被堆疊在一起。 考慮到明天您可能會收到一個新要求,即您需要使用不同的邏輯,不同的連接等來實現身份驗證。 另外,關於在使用單例之后如何測試系統,您將如何模擬呢?

不要去辛格爾頓! 它並不比美化的面向對象的命名空間好,實際上, Singleton幾乎與使用全局變量一樣糟糕,並且僅比使用全局函數庫稍好一點(它本身也是不好的)。 最好將創建的對象發送到您的類。

由於PHP 5對象傳遞給其他對象默認情況下是通過引用傳遞的。 他們不會創建新實例(除非使用clone關鍵字)。 這允許將任何類型的會話信息作為對象傳遞給需要它的其他對象。

我可以推薦的最好的辦法是制作一個帶有會話特定信息的“會話”類。 將此類發送到您的MVC對象。 這使您可以在不存在Session的情況下測試系統(或者您可以為此目的創建模型狀態)。 雖然將一個對象傳遞給另一個對象使它們之間的耦合比理想情況更緊密,但只要該類足夠原始,就可以在其他使用相同類的系統或應用程序的某些部分中輕松創建該類。

這也使在任何給定時間甚至在同一請求內轉移狀態或會話變得更加容易。

在PHP中,請求完成后,對象不會保留在內存中。

因此,即使將對象設為Singleton,每個請求也將具有該類的自己的實例。

但是不同之處在於,在單個請求中多次訪問對象時。 在這種情況下,單例具有以下優點:

  • 防止創建多個冗余實例,從而減少請求的內存使用量。

  • 跨多個訪問共享相同的數據。

例如:Codeigniter的get_instance函數是Singleton Concept的實現,在每個請求中僅使用一個Codeigniter實例。

暫無
暫無

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

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