2010-06-13 29 views
0

我正在創建一個應用程序,我想要在MySQL或SQL Server上運行(不是同時運行)我創建了兩個PHP類DatabaseMySQL和DatabaseSQLSVR,並且希望我的應用程序能夠根據在安裝時設置的常量知道要使用哪個數據庫類。MySQL或SQL Server

define(DB_TYPE,「mysql」); //或「sqlsrv」

我在想辦法解決這個問題。我的想法是在我實例化數據庫的地方執行「if else」:

$ db =(DB_TYPE ==「mysql」)?新的DatabaseMySQL:新的DatabaseSQLSVR;

我知道必須有更好的方法來做到這一點。假設我想稍後添加第三個數據庫類型;我必須去重做我的所有代碼。

+1

現實情況是,除非是非常簡單的SQL,否則您必須調整語句。但如果你想獲得最佳表現,這就是要走的路。 – 2010-06-13 18:31:37

+0

而且你總是可以使用switch ... case語句而不是if ... else if ... else。當然,還有更好的解決方案,請參閱 – 2010-06-13 22:20:41

回答

1

在描敘:

用定義來定義「DB_TYPE」作爲YourFullyQualifiedClassName,然後...

define('DB_TYPE', 'DatabaseMySQL') // or DatabaseSQLSVR or ... 
$myDBType = DB_TYPE; 
$db = new $myDBType(); 
+3

我建議讓一些(抽象?)基類繼承並檢查你的新實例是否確實繼承了那個類(參見http://www.php.net/instanceof) – Kris 2010-06-13 18:36:45

+0

Kris,我做了一個「數據庫」這兩個類都擴展的超類;這似乎是正確的做法。但是,說實話,我不確定在這一點上它會對我有什麼好處? – jwerre 2010-06-14 02:05:24

+0

它對您有益,因爲您在更具體的類中覆蓋的所有內容都必須與共享的基類保持兼容。與更具體的實例交談的其他代碼現在可以假定它正在與更通用的基類進行通信,而不用擔心實際的實現。 – Kris 2010-06-14 08:46:01

0

通常的方法是讓它們都調用相同的(比如說數據庫),並且每個都放在一個單獨的文件中。然後你需要:

define(DB_TYPE, "mysql"); // or "sqlsrv" 
require('db/' . DB_TYPE . '.php'); 

你可以只是$ db = new Database();

編輯:請注意,它是至關重要的,您的系統正常工作有一個接口,這兩個類相應地執行。

+1

以下的答案,這些答案可以很好地解決任何自動加載問題,並且如果您使用的是正確的IDE,則可能會讓您感到困惑(代碼完成將不知道用於「數據庫」的類)我會說不好的主意。 – Kris 2010-06-13 18:38:36

+0

如果它們實現相同的接口,則不適用。 此外,類必須使用相同的確切方法才能正常工作。 – kamasheto 2010-06-13 18:56:05

1

您應該研究使用諸如PEAR等技術。

這是關於梨的一篇很好的文章。 http://www.evolt.org/node/21927

+1

梨看起來很有趣。請注意,您仍然需要自己編寫特定於版本的SQL語句,以獲得最佳性能,或者完成非標準SQL但在不同數據庫中受到不同支持的事情。 – 2010-06-13 18:38:05

+0

我同意,如果您的要求是支持多個DBMS,那麼使用一個庫。 – 2010-06-13 19:07:27

+0

我檢查了它,它看起來像PEA :: DB自發支持多個數據庫連接。我不確定我想要那種內存使用情況。更何況我已經建立了我的數據庫類。 – jwerre 2010-06-14 02:02:01

0

我建議您創建兩個數據訪問對象,用於執行應用程序需要的各種數據庫操作。使用Factory Pattern返回MySQL或MS SQL實現,並使用該數據訪問對象在PHP頁面中執行所有數據訪問。

這樣,您可以根據每個目標數據庫的需要調整行爲(如OMG Ponies所建議的)。如果你使用一個通用的基類,你可以繼承兩個數據庫的相同實現,並且只在必要時提供特定的實現(雖然我沒有做太多OO PHP ......不知道是否支持繼承)。

+0

是的,我可以擁有數據庫超類。 – jwerre 2010-06-13 22:55:27

0

的問題是,有你從未想象過的語法的一些奇怪的位這是由不同的驅動程序以完全不同的方式處理 - 例如解釋計劃,交易...

一個很好的出發點是使用一個通用的抽象工具,如dbxadodb,或PDO

在每種情況下,DBMS驅動程序都可以以與用戶名或密碼相同的方式引用爲數據項 - 無條件語句。

C.