2012-03-25 74 views
0

好吧,我無法插入概覽圖像,但我需要爲我的研究創建一個PHP應用程序,它必須允許學生註冊,並且管理員可以編輯課程和學生信息。 我們不需要以OOP風格對其進行編碼,但是因爲它是OOP編程的最佳編程實踐,所以爲什麼不從一開始就學習OOP。這個簡單的PHP應用程序的最佳OOP方法?

我是一個初學者,但我知道關於OOP,類,繼承,setter和getters以及所有那些很酷的術語的基礎知識,但我很難決定這個應用程序的哪些部分應該是對象,我應該讓課程和學生課程或添加,編輯和刪除課程?將不勝感激任何關於如何處理和可視化這樣的問題的建議。

+1

「它是編程OOP的最佳編程實踐」 - 說誰? – 2012-03-25 18:53:39

+0

閱讀這兩本書http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882和http://www.amazon.com/Applying-Introduction-Object-Oriented-Iterative-Development/dp/B003MV55EA/ref = sr_1_76?s = books&ie = UTF8&qid = 1332549040&sr = 1-76 – Songo 2012-03-25 18:54:30

+0

@OliCharlesworth好的,在我收到的書中解釋說,大多數語言都是朝着OOP方向發展,這可能不是最佳實踐,但而是我的技能的一個很好的補充。 – grasshopper 2012-03-25 18:58:27

回答

5

大致來說:這是我會怎麼做:

  1. 存儲在SQL或XML數據。您需要兩個SQL表格,一個用於學生,另一個用於課程。您可以使用一個包含所有數據的XML文件,也可以使用兩個文件(我推薦)。

  2. 與像一個屬性創建一個名爲類,例如,dataItem「$ arr_fields」對應於單個數據記錄(在SQL表中的一行,或XML記錄)。

  3. 的DataItem的類應該有以下方法(所有公共):

    • loadFromSQL()(或loadFromXML()
    • saveToSQL()(或saveToXML())
    • add()edit()delete()
    • a view()使用HTML的方法
    • 這些方法顯然是你的sed在SQL/XML數據和類的$ arr_fields之間讀取和寫入數據,並在$ arr_fields中顯示數據。 $ arr_fields的鍵是特定SQL表的SQL列名稱(或XML標記或屬性名稱)。
  4. 儘量不要在構造函數或其他任何用於修改類數據的方法中調用loadFromSQL()或saveToSQL()。保持這些行爲分開。編輯:這是一個個人喜好,它可以幫助我跟蹤我的對象的狀態。

  5. 創建擴展dataItem類的Student和Course類。

  6. 如果需要,您可以在擴展類中覆蓋方法,例如view()方法。

  7. 然後,您可以從管理對象(如rcdmk建議)或可能從StudentFolder和CourseFolder類中調用學生和課程中的方法,其中的view()方法包含需要執行的操作的按鈕。 (讓StudentFolder和CourseFolder擴展您創建的Folder類)。

UPDATE:

例如:如果在一個SQL表的主鍵是id,那麼的DataItem的loadFromSQL($ ID,$表名)應該設置$ arr_fields以便其鍵列名和它的值是來自主要值等於$ id的行的值。

學生,則可以覆蓋loadFromSQL()如下:

class Students extends dataItem { 

    // other attributes 

    public function loadFromSQL($id) { 
    parent::loadFromSQL($id, "Students"); 
    } 

} 

編輯:複議,它可能是最好設置$ arr_fields [ 「ID」] = $ ID,也可以設置$表名用dataItem的構造函數 - 那麼你不必重載loadFromSQL()或爲它指定參數。 loadFromSQL()應該隨後加載記錄(如果存在)。如果設置了$ arr_fields [「id」],saveToSQL()應該在SQL中保存$ arr_fields,如果未設置,則創建新記錄。無論如何,您必須找到與您的數據交互的一致方式,這些只是可能性。但是,如果您對OOP和SQL或XML沒有經驗,那麼您可能會爲自己打開一堆蠕蟲,而僅使用函數和php數組來處理您的數據可能更好。除非你有一些時間學習...

+0

好吧,我想我明白了。 dataItem將是父類,其他兩個擴展該類,但是你能解釋一下4.,你的意思是我應該在學生和課程類中創建這些函數,這些動作應該如何分開? – grasshopper 2012-03-25 19:30:15

+0

您不必在擴展類中重新創建這些方法 - 這是繼承的要點,您只需要在父類中定義它們一次。我的意思是將動作分開:在您的代碼和思維中,保留對類數據進行操作的方法,與操作SQL或XML數據的方法分開。例如,當你實例化一個Student對象並想用特定SQL行中的數據填充它時,你可以調用構造函數(它根據數據構造一個'空'對象),然後分別調用loadFromSQL() 。 – Stefan 2012-03-25 19:39:13

+0

好吧,我想我明白你的意思,謝謝我的欣賞,我可能會重讀這個頁面幾次。 – grasshopper 2012-03-25 19:52:26

2

從一個簡單的角度來看:

摘要的主要對象爲這種行爲類和使用方法的對象:

學生(對象)由管理員(對象),刪除(動作),因此

管理員類將有一個deleteStudent方法,因爲管理員刪除學生。

另一個aprouch是集中所有學生相關的行動在學生類:

Student類將有一個public delete方法管理員可以使用。

任何人認爲這個更好的解釋方式可以編輯這個wiki。

2

想想你的系統的哪些方面實際上是對象,你知道,你可以做些什麼。方法是你對對象做的事情。所以,你在課程和學生課程的正確軌道上,添加,編輯和刪除將是這些類的方法。

但不要太過於沉悶。如果這不是您的核心任務目標,那麼您可以通過嘗試以完全正確的方式完成所有事情而迅速克服困難。如果你能夠制定一個清晰的方法去到你需要去的地方,那麼去做吧,如果它看起來很混亂,請稍微退一步,再學習一些。

2

你說你知道OOP的基礎,但是你問你是否應該創建課程,學生類或添加,刪除,編輯類。那麼也許還有其他的做法,但我猜最受歡迎的一個,我唯一知道的是將名詞用作類和動詞作爲他們的方法。因此,直觀上類「添加」或「編輯」有問題。如果我是,我會做的是,想想可能被認爲是一個對象的所有「實體」 - 如學生,課程,講師,課堂(房間),並取決於你的模型應該是多麼先進,你可以添加更多像建設等,然後嘗試實施基本的東西,如創建新的學生,註冊一門課程,將老師與課程相關聯等。一旦你有它的地方和它工作你可能想要添加先進的東西,如繼承。例如,你可能想說,老師和學生都是一個人,所以你可能想要創建這樣的抽象類並使用繼承。

相關問題