簡體   English   中英

建立PHP PDO DB連接

[英]Establishing PHP PDO DB Connections

我是在PHP中使用PDO的新手,在回顧了一些示例代碼之后,我想知道如何最好地有效地處理數據庫連接。

我在dbconnector.php中建立了以下連接。 回聲只是測試代碼:

try {
    $db = new PDO("mysql:host=$servername;dbname=$dbname", $appusername, $apppassword);
    // Set the PDO error mode to exception
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Connected Successfully";
} catch (PDOException $e) {
    echo "Connection failed: " . $e->getMessage();
}

在每個類中利用此代碼的最佳方法是什么,這樣我就不會陷入將其復制到每個需要獲取數據的函數中的麻煩? 我考慮過擴展PDO並根據需要創建一個db對象,但是我讀了一些似乎不鼓勵這樣做的帖子和文章,因為PDO已經是面向對象的。

我考慮過擴展PDO

這是一個完全可以理解的菜鳥錯誤。 但是,這(至少)違反了SOLID的兩個規則: SRPLSP

單一職責原則 :通過擴展PDO您的新類現在可以將數據訪問與新類打算執行的操作耦合在一起。

Liskov替換原則 :通過擴展PDO您還聲明了新類一個更大的PDO版本,但不是。 任何為PDO鍵入提示的function foo(PDO $pdo)function foo(PDO $pdo) )都將接受您的新類作為參數-實際上,不應接受。

我認為也可以為開閉原則辯護-但這給您足夠的思考空間。

對於類來說,使用該數據庫的輸出而不是將整個數據庫連接注入類可能更有意義。 也就是說,不要強迫新類使用數據庫連接,而只是將所需的數據傳遞給該類。 這是最簡單的實現。

就是說,有充分的理由需要將數據庫連接注入到一個類中。 但是,應該使用依賴項注入來完成此操作。 這是一個簡單的示例:

class Foo
{
    public function __construct(PDO $pdo){
         $this->PDO = $pdo;
    }

    public function doTheThing(){
         $this->PDO->query(/* do whatever */);
         // ...
    }
}

$pdo = new PDO(/* whatever */);
$foo = new Foo($pdo);

這樣,您可以基於自定義構建的PDO實例實例化新類,並使用不同的PDO對象訪問不同的數據庫。

如果您需要進一步,可以創建一個“數據訪問”接口,創建實現它的對象,並為該接口鍵入提示。 但是,僅注入PDO實例是朝正確方向邁出的美好的第一步。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM