2011-05-13 97 views
6

我正在努力解決如何最好地完成我的課程設計工作。php抽象類和涉及靜態方法的接口?

我的情況。

我有一個包含訂單的方法和信息所需要的2個兒童班

order_Outbound

和order_inbound

每個子類需要一個名爲創建並獲得2靜態公共方法的順序抽象類

但從我已閱讀有關PHP 5.3你不能有抽象的靜態方法?

所以我的想法是有一個接口Order_Interface接管該角色,但我如何實現它。我是否仍然在父類中實現它

在這種情況下,父抽象類仍然要求我在抽象類中創建一個get和create方法。或者我在兒童中實施它,並從抽象類擴展?

也! 出站和入站的孩子都需要一個創建靜態方法,但需要不同的參數傳遞

我在界面上有公共靜態功能可以創建()

和內order_outbound其實施其聲明公共靜態功能創建($ address,$ reference,$ orderID)

+0

我沒有看到代碼,所以它只是一個猜測而已,但是Order :: create()和Order :: get()可能不應該是靜態的,除非你有一些理由要做它們是靜態的 – Crozin 2011-05-13 01:18:56

+0

@Crozin - 如果出於某種原因不想使用構造函數,並且想要創建實例的方法,則可能不希望創建實例來調用實例創建方法。 – 2011-05-13 01:24:14

+0

對不起,這正是我爲什麼這樣做的原因。這些類表示數據庫記錄。我的構造函數受到保護,並使用靜態方法來檢索類的實例。 – roguecoder 2011-05-13 03:25:05

回答

6

在包括PHP在內的大多數語言中,不能要求類實現靜態方法。

這意味着類繼承和接口都不允許您要求所有實現者定義靜態方法。這可能是因爲這些功能旨在支持多態而不是類型定義。在靜態方法的情況下,你永遠不會有一個對象來解析類型,所以必須明確地做ClassName::Method,所以理論上你不會從多態性中獲得任何東西。

因此,我看到三個解決方案

  1. 聲明的靜態方法在每個類(畢竟,你永遠不會

  2. 如果你想有一個方法來創建類的實例,但不希望需要實例調用此方法,則可以創建「Builder」類來實現此目的(例如OrderBuilder),以便實例化OrderBuilder並在該對象上調用Create方法,而不是獲取Order實例

  3. (推薦)爲什麼不簡單地使用Order構造函數?

+0

在我的數據庫中我有2個表格。 orderheader和orderbody。有兩種訂單出貨和入庫。我不希望能夠在沒有數據庫記錄的情況下簡單地創建對象的實例。所以使構造函數受到保護,並允許人們通過創建新的數據庫記錄(order_outbound :: create())或檢索已存儲的記錄(order_outbound :: get(id))來獲取實例。 – roguecoder 2011-05-13 03:30:55

+0

因爲我從來沒有打算對這兩個類進行擴展,你的建議只是忽略接口和抽象類,只是在每個類中分別輸入靜態方法而沒有上層的強制我? – roguecoder 2011-05-13 03:31:01

+0

我想說,如果你不想使用構造函數,那麼是去與靜態方法,而不要掛在「上層強制」位。 – 2011-05-13 03:35:32