簡體   English   中英

在PHP中用$ GLOBALS聲明數據庫表名稱

[英]Declare Database table names with $GLOBALS in php

問題

我正在使用$GLOBALS[]變量在我的php文件中定義數據庫中表的名稱,以使更改表名稱變得簡單,並具有通用性/舒適性。 但..

我聽說使用$GLOBALS[]有點不好。


因此,它是這樣發生的:

數據庫中的表

Users
Orders
Products

其實有10-20張桌子...

global_vars.php

<?php

    $GLOBALS['t_users'] = 'Users';
    $GLOBALS['t_users'] = 'Orders';
    $GLOBALS['t_users'] = 'Products';

    //...
    //etc.

?>

現在,當我需要從網站的不同頁面並出於不同目的訪問數據庫時,我會這樣做:

function GetUsers(){
    $sql = "SELECT * FROM $GLOBALS[t_users]";
    // ...execute
}
function Get_OneUser($id){
    $param['id'=>$id];
    $sql = "SELECT * FROM $GLOBALS[t_users] WHERE id=:id";
    // ...etc
}
function Get_Orders(){
    $sql = "SELECT * FROM $GLOBALS[t_orders]";
    // ...etc
}
function Get_OrdersB(){
    $sql = "SELECT * FROM $GLOBALS[t_orders] WHERE id=:id";
    // ...etc
}
function Get_Products(){
    $sql = "SELECT * FROM $GLOBALS[t_products]";
    // ...etc
}
//   -- AND SO ON, AND SO ON........

想象一下,有一天我將需要重命名表/更改數據庫。 然后,(這種結構),我只能改變一個global_vars.php ..這將是完美的!


一般問題

有什么更好的方法呢?

為什么這是/不是好/壞? 幫我弄清楚! 謝謝!

這已經在StackExchange上被詢問了很多次!

在這里看看答案,這將解釋原因。

PHP中的全局變量是否被視為不良做法? 如果是這樣,為什么?

閱讀依賴注入(使用Pimple!)。 使用依賴注入,您可以在一處定義所有內容,然后在構造函數中傳遞所需的內容,或在類中使用setter。 DIC(依賴項注入容器)也可以創建工廠方法來設置這些東西。 這樣您就可以以更少的風險獲得所需的收益。

TL; DR:是的,但這取決於您要改進的地方。

第一個問題是全球狀態。 在PHP中, $GLOBALS屬於組構造,稱為“ superglobals ”,它們創建的問題與global變量基本相同。

將表名保存在單獨的配置文件中的一般想法是一個好主意,但建議對它們的結構稍作不同:

  • SQL應該放在數據映射器中
  • 數據映射器的初始化應通過工廠或使用DI容器來完成(是合適的容器,如AurynSymfony DI ,而不是像Pimple這樣的卑鄙的服務定位器)
  • 通過構造函數作為參數將配置傳遞給映射器

更新

數據映射器是類,負責與持久性進行交互(通常是數據庫)。 實現細節可能有所不同,但是我實現它們的方式的用法最終看起來像這樣:

$book = new Book;
$book->setId(51);

$mapper = new BookMapper($pdo, $config);
$mapper->fetch($book);

if ($book->getReleaseDate() < TWO_MONTHS_AGO) {
    $book->setDiscountPercents(30);
}

$mapper->store($book);

有關更多“實用”代碼,您可以嘗試查看此類

暫無
暫無

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

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