[英]pros and cons of making my auth system a singleton class
我在應用程序的OOP設計方面面臨兩難選擇。 我是否應該將auth類設為單例。 我看到kohana框架和zend框架將其auth類用作單例。 使身份驗證類成為單例的缺點是什么? 有什么優點? 另外,我正在構建的應用程序將是企業應用程序,並且需要擴展,因此如果是單例,我的身份驗證系統也可以擴展嗎?
避免使用單例,僅在硬件對每個應用程序限制一個對象->資源的情況下使用單例。 如果合並了singleton,則將無法與系統中的其他交換auth類,您將被堆疊在一起。 考慮到明天您可能會收到一個新要求,即您需要使用不同的邏輯,不同的連接等來實現身份驗證。 另外,關於在使用單例之后如何測試系統,您將如何模擬呢?
不要去辛格爾頓! 它並不比美化的面向對象的命名空間好,實際上, Singleton幾乎與使用全局變量一樣糟糕,並且僅比使用全局函數庫稍好一點(它本身也是不好的)。 最好將創建的對象發送到您的類。
由於PHP 5對象傳遞給其他對象默認情況下是通過引用傳遞的。 他們不會創建新實例(除非使用clone關鍵字)。 這允許將任何類型的會話信息作為對象傳遞給需要它的其他對象。
我可以推薦的最好的辦法是制作一個帶有會話特定信息的“會話”類。 將此類發送到您的MVC對象。 這使您可以在不存在Session的情況下測試系統(或者您可以為此目的創建模型狀態)。 雖然將一個對象傳遞給另一個對象使它們之間的耦合比理想情況更緊密,但只要該類足夠原始,就可以在其他使用相同類的系統或應用程序的某些部分中輕松創建該類。
這也使在任何給定時間甚至在同一請求內轉移狀態或會話變得更加容易。
在PHP中,請求完成后,對象不會保留在內存中。
因此,即使將對象設為Singleton,每個請求也將具有該類的自己的實例。
但是不同之處在於,在單個請求中多次訪問對象時。 在這種情況下,單例具有以下優點:
防止創建多個冗余實例,從而減少請求的內存使用量。
跨多個訪問共享相同的數據。
例如:Codeigniter的get_instance函數是Singleton Concept的實現,在每個請求中僅使用一個Codeigniter實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.