2017-03-16 48 views
-2

嘿傢伙如何從點的視圖

一個面向對象的數據庫查詢,我知道#2是不可以問正確的地方,如果有哪裏 這個問題更適合的另一Stackexchange組,那麼請告訴我。

所以,我試圖學習OOP。我認爲我很瞭解它,但有一件事我不能確定 的正確方法,那就是數據庫的處理。

所以,我很困惑一點,應該在哪個班上做什麼。

可以說我有一個db類。在這個類的內部,我在構造函數中連接到數據庫。現在讓我們說 我有一個用戶類。

所以,現在的問題: 我應該在哪裏查詢例如創建一個新的用戶?我應該在用戶類中創建一個方法, 還是應該在DB類中創建一個方法?如果在數據庫類中,它是否應該是像create_user() 這樣的方法,還是應該更像全局性的東西,如query,我可以傳入任何我想要的查詢。

這裏,例如從GitHub項目:

https://github.com/christran/PHP-OOP-Login-Register-System/blob/master/classes/user.php 

正如你可以看到,所有的查詢方法在db.php中和user.php的,他只是調用這個方法。那麼這是正確的路嗎?

或者它沒有關係?五月,這些批評中的任何一個比另一個更「面向對象」?

這其實只是讓我很困惑,我不明白最好的方法是什麼。我搜索了很多,但從未 找到一篇文章到這個特定的問題。

所以我做了什麼,我在Github上尋找項目,看着他們的代碼,他們是如何解決這個問題的...... 但是用這種方法我更加困惑,因爲你看到了兩者。

它只是編碼器的偏好?

我非常感謝您的幫助。祝你今天愉快! :)

這裏我的意思一個小例子:

class user { 
    private function createUser() { 
     //SQL Query here (prepared statements etc...) 
    } 
} 

OR:

用戶類中查詢

class user { 

    private function createUser() { 
     // Call to db.class to insert_method() ... 
    } 
} 
+0

對象關係映射不是OOP。 OOP是關於將系統分解爲通信狀態機的。 ORM正在重塑網絡數據模型,因爲開發人員不瞭解數據的關係模型。數據庫最好被視爲事實的代表者,而不是對象的代表者。 – reaanb

回答

-1

包含查詢不該」的方法的createUser t是User對象的一部分,但不是數據庫對象。第一個是商業邏輯。後者用於管理數據庫方法併爲執行語句提供通用功能。這些對象之間的不同對象應該是從用戶對象獲取數據並生成查詢以將其存儲在數據庫中的對象。

我認爲你在這裏尋找的術語是ORM (Object-relational mapping)

這個概念是關於將對象映射到不同的,不兼容的結構,如數據庫。

有可用於PHP的ORM庫/框架,它可以爲您完成大部分工作,其中一些可用作流行的MVC框架(如Eloquent ORM in Laravel)的一部分或可用於其中。例如,他們通常會通過在配置正確的數據庫表後實現所需的SQL語句來提供基本的CRUD操作。

就OOP而言,您通常會在其上添加額外的圖層。因此,您得到了一個業務對象User,其中包含用戶的規則,例如用戶名稱必須遵守的規則。業務對象將執行這些規則幷包含User對象的一般行爲。爲了節省,您可以使用ORM將用戶對象保存到特定數據庫。數據庫邏輯不在用戶對象本身中。它不應該知道具體的查詢來保存自己,也許它不應該知道加載和保存等概念。它只包含邏輯和數據,實現的其他部分負責持久化這些數據(可選地使用ORM框架使事情更容易)。

0

基本上,您正在調查ORM。

具體回答你的問題,

我應該在用戶類

這是可能的,被稱爲活動記錄模式,其中一個實體包含相關不僅方法創建方法(如$user->getBirthday()),還包括與數據庫交互相關的方法(如$user->save())。

還是應該在DB類中創建一個方法?

這是不可能的,因爲這個班會變得非常大。

但是,您可以爲每個實體創建一個姐妹類,它將負責數據庫交互。這種方法稱爲數據映射器模式。例如,有一個User類包含與用戶有關的方法,還有一個UserMapper類,它通過泛型方法$userMapper->save()$userMapper->find()等從抽象映射類繼承。

+0

我對這個問題有疑問。我只是看着OP的鏈接github回購,並看看db類。 https://github.com/christran/PHP-OOP-Login-Register-System/blob/master/classes/db.php該類很短,因爲他只有一個「插入」方法,並將查詢傳遞給梅託德。所以所有查詢的一種方法。所以這樣,班級不會變大。那是不好的做法? – Twinfriends

+0

@Twinfriends對不起,我不明白你的問題。 –

+0

好的,讓我再試一次。 :P如果你在我的評論中進入鏈接的git倉庫,你會看到一個db.php文件。向下滾動到第73行。有一種稱爲「插入」的方法 - 一種將數據插入到db類中的方法。並且整個項目中的每個查詢都通過此方法處理。這是好還是不好的做法?如您所見,他將表名和鍵值對傳遞給該函數。這是整個項目中將數據插入數據庫的唯一功能。這就是我的問題,如果這是一個好主意,或者如果我應該創建更多的方法,如createUser,createItem等。 – Twinfriends