聲明:我還沒有處理過的,而PHP的,所以我的語法可能是錯誤的。
術語OOP有點模糊imo,這意味着不同的人在聽到它時會想到稍微不同的東西,所以當你聽到矛盾的事情時不要混淆。
使用類一起構造類似的函數不會損害你的代碼,但是你基本上只是使用類作爲函數的名稱空間。通常情況下,您需要以某種方式定義類,以便您的系統的某個方面進行封裝,這意味着只有該類的代碼纔會直接處理該方面,而其他人則只使用該類。
例如,您可以有一個管理打印作業隊列的類。如果您有一些想要打印文檔的代碼,則它不必知道作業排隊或如何發送到打印機,它只需知道打印作業隊列對象(我們稱之爲$jobQueue
),它可能有一個像$jobQueue->enqueue($document)
這樣的方法。
現在你可能會說:「那代碼也可以同樣使用全局函數enqueueJob($document)
,」直到你想有一個以上的隊列(對於不同的打印機)是真的,並以不同的方式工作隊列(將作業存儲在數據庫中,存儲在內存中或根本不存在 - 想象一下直接進入回收站的隊列:))。使用OOP,這種場景是沒有問題的,並且這些細節完全隱藏在想要打印文檔的代碼中 - 所有它必須關心的是它有一個帶有enqueue
方法的作業隊列對象。
爲了獲得這種作業隊列的「互換性」,他們需要有一個通用的接口(在這種情況下,這種方法是enqueue
方法),必須仔細選擇它以涵蓋想要打印的代碼的所有需求的東西,但沒有對打印隊列的工作方式做太多的假設。例如,您可以想象enqueue
方法將文件路徑作爲參數告訴隊列將文件存儲到哪裏 - 但該接口對於在數據庫上運行的隊列無用。這是找到好的抽象藝術。
現在回到你原來的問題,只要沒有考慮到新類應該提供哪些抽象/接口,就把相關函數組合到一個類中,並不是真正的OOP。沒有這一點,所有使用這個新類的代碼將被硬連線使用,如果您決定需要不同類型的打印機隊列,則需要更改/重新檢查。 :)
但是,「不是OOP」是不一樣的「不是一個好主意」。我說去做,重新安排你的功能。在我看來,重要的是要記住,並非每件事都需要成爲一個對象或適合某種抽象。但是也許你會發現你確實有一些功能可以完成類似的功能(文件隊列,數據庫隊列),這些功能可以抽象成一個通用接口。
如果它可以幫助你編寫更好的代碼,爲什麼不呢? – phant0m 2013-05-04 11:47:58
這不是面向對象的編程(完全),即基於調用的編程。您可能想了解[實用模式](http://c2.com/cgi/wiki?UtilityPattern)並查看[實用程序類是邪惡的?](http://stackoverflow.com/q/3340032/367456) - 請記住,不同的編程語言有不同的需求。在PHP中,您應該瞭解靜態和動態方法調用的不同之處。 – hakre 2013-05-04 12:01:24
如果你想採用這種方法,只需獲得一本[關於重構的好書](http://martinfowler.com/books/refactoring.html),並應用你學到的東西。你最終會寫出更好的代碼。 – Yoshi 2013-05-04 12:09:44