爲什麼不吸氣?以及它如何與封裝principe結合?它安全嗎?爲什麼屬性request/query/attributes/...在Symfony2中是公共的?
Upd: 是的,我是關於Request
。安全:我的意思是任何人在代碼(通過使用聽衆)可以做$request->attributes = null;
爲什麼不吸氣?以及它如何與封裝principe結合?它安全嗎?爲什麼屬性request/query/attributes/...在Symfony2中是公共的?
Upd: 是的,我是關於Request
。安全:我的意思是任何人在代碼(通過使用聽衆)可以做$request->attributes = null;
如果您在談論Request和Response對象,幾天前在Symfony開發人員郵件列表上討論了這個問題。我邀請你看看它here。
爲什麼不吸氣?不確定是否有明確的答案,但我認爲這主要是基於個人口味的決定。
它破壞封裝嗎?對於這個特殊情況,我不認爲。我的推理是,現在,對於現在公開的各種對象沒有執行特殊的邏輯。所以最後,你最終會通過一個getter來獲取對象,並直接讀取或修改它。使用公共屬性檢索對象沒有多大區別。
// With Getters
$parameterBag = $request->getQuery();
$parameterBag->get('key');
// With Public Properties
$parameterBag = $request->query;
$parameterBag->get('key');
當您需要確定某個屬性具有特定的值或格式時,應執行封裝。例如,假設你有一個具有成本屬性的類,並且此屬性不應該爲負數。因此,如果成本屬性是公開的,可以通過執行類似$receipt->cost = -1;
的設置將其設置爲負值。然而,如果你把它設置爲私有的,並且類的用戶只能通過setter來設置它,那麼你可以通過在setter代碼中做一些特殊的驗證來確保成本從不低於0。
在我們的例子中,我們正在談論一個集合對象,一個ParameterBag對象是精確的。我不認爲這個對象有特殊的要求,但我可能是錯的。所以對我而言,通過公共財產訪問這些屬性是正確的。
我可以看到贊成getters的主要參數是它會更符合使用getter的框架的其他部分。但是,獲得者可以與公共財產共存。總之,我認爲這種情況是安全的。公共財產只能在特殊情況下使用,這種情況似乎是有益的,而且這樣做是正確的。
封裝已封裝的內容有什麼意義?我的意思是 - 這些屬性中的每一個都是一個帶封裝的parameterBag實例。
感謝您在symfony-devs中鏈接主題。我通常閱讀這個組,但沒有注意到這個話題。 – Koc 2011-05-03 09:13:41
是的,我注意到你在這個symfony-devs論壇上很活躍,這就是爲什麼我建議你這個鏈接:)你是對的事實,我可以設置一個屬性爲null,所以也許這將是一個好主意通過僅爲屬性提供setter和getter來強制封裝。 – Matt 2011-05-03 14:43:54