在php中用$ GLOBALS声明数据库表名

时间:2017-05-26 14:01:15

标签: php database global-variables

问题

我正在使用$GLOBALS[]变量在我的php文件中定义来自DB的表的名称,以便简单地更改表的名称和一般的移动性/舒适性。但..

我听说使用$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 中更改一行行。这将是完美的!

一般问题

什么是更好的方法来制作它?

为什么这是/不好/坏?帮帮我搞清楚!谢谢!

2 个答案:

答案 0 :(得分:2)

StackExchange上已经有很多次问过这个问题了!

看看这里的答案,这将解释原因。

Are global variables in PHP considered bad practice? If so, why?

阅读依赖注入(使用Pimple!)。使用依赖注入,您可以在一个位置定义所有内容,并通过构造函数或使用类中的setter传递所需的内容。 DIC(依赖注入容器)也可以创建工厂方法来设置这些东西。因此,您可以获得所需的好处,同时降低风险。

答案 1 :(得分:2)

TL; DR:是的,但这取决于您想要改进的内容。

第一个问题是全球国家。在PHP中,$GLOBALS属于组构造,称为“superglobals”,它们创建的问题与global变量基本相同。

将表名保存在单独的配置文件中的一般想法是一个很好的想法,但建议以不同的方式构建它:

  • SQL应该进入数据映射器
  • 数据映射器的初始化应该通过factory或使用DI容器(正确的,如AurynSymfony DI完成,而不是像Pimple这样糟糕的服务定位器)
  • 将配置传递给映射器,通过构造函数作为参数

更新

Data mappers是类,负责与持久性(通常是数据库)交互。实现细节可能会有所不同,但是我实现它们的方式,使用最终看起来像这样:

$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);

要获得更多“实用”代码,您可以尝试查看this class